diff options
Diffstat (limited to 'sys-apps/grub/files/grub-0.92/grub-0.91-bootonce.patch')
-rw-r--r-- | sys-apps/grub/files/grub-0.92/grub-0.91-bootonce.patch | 249 |
1 files changed, 0 insertions, 249 deletions
diff --git a/sys-apps/grub/files/grub-0.92/grub-0.91-bootonce.patch b/sys-apps/grub/files/grub-0.92/grub-0.91-bootonce.patch deleted file mode 100644 index 90d7cfd3fda4..000000000000 --- a/sys-apps/grub/files/grub-0.92/grub-0.91-bootonce.patch +++ /dev/null @@ -1,249 +0,0 @@ -To: bug-grub@gnu.org -cc: Keir.Fraser@cl.cam.ac.uk -Subject: PATCH (updated): 'lilo -R' functionality -From: Keir Fraser <Keir.Fraser@cl.cam.ac.uk> -Message-Id: <E16iFu3-0002VK-00@wisbech.cl.cam.ac.uk> - -The following is a slight modification to the patch I submitted a week -or so ago. This will cause GRUB to skip displaying the boot menu if a -one-shot default has been specified (just as lilo does with '-R'). - -Same caveats as for previous patch: - * The new 'savedefault' function in the GRUB shell is incomplete. - Only works if the filesystem containing stage2 file is mounted. - * Patch is against grub-0.90, but patches directly to 0.91 - -I hope this goes into CVS in the next round of updates :-) - - -- Keir Fraser - - - -diff -urBP grub-0.90-old/stage2/builtins.c grub-0.90-modified/stage2/builtins.c ---- grub-0.90-old/stage2/builtins.c Fri Feb 22 11:59:57 2002 -+++ grub-0.90-modified/stage2/builtins.c Fri Feb 22 13:48:36 2002 -@@ -785,6 +785,17 @@ - default_func (char *arg, int flags) - { - #ifndef SUPPORT_DISKLESS -+#ifndef GRUB_UTIL -+ /* Has a forced once-only default been specified? */ -+ static int savedefault_helper(int); -+ if ((saved_entryno & STAGE2_ONCEONLY_ENTRY) != 0) -+ { -+ grub_timeout = 0; -+ default_entry = saved_entryno & ~STAGE2_ONCEONLY_ENTRY; -+ savedefault_helper(0); -+ return 0; -+ } -+#endif - if (grub_strcmp (arg, "saved") == 0) - { - default_entry = saved_entryno; -@@ -3074,22 +3085,15 @@ - }; - - --/* savedefault */ -+ -+#if !defined(SUPPORT_DISKLESS) && !defined(GRUB_UTIL) -+/* Write specified default entry number into stage2 file. */ - static int --savedefault_func (char *arg, int flags) -+savedefault_helper(int new_default) - { --#if !defined(SUPPORT_DISKLESS) && !defined(GRUB_UTIL) - char buffer[512]; - int *entryno_ptr; -- -- /* This command is only useful when you boot an entry from the menu -- interface. */ -- if (! (flags & BUILTIN_SCRIPT)) -- { -- errnum = ERR_UNRECOGNIZED; -- return 1; -- } -- -+ - /* Get the geometry of the boot drive (i.e. the disk which contains - this stage2). */ - if (get_diskinfo (boot_drive, &buf_geom)) -@@ -3115,10 +3119,10 @@ - entryno_ptr = (int *) (buffer + STAGE2_SAVED_ENTRYNO); - - /* Check if the saved entry number differs from current entry number. */ -- if (*entryno_ptr != current_entryno) -+ if (*entryno_ptr != new_default) - { - /* Overwrite the saved entry number. */ -- *entryno_ptr = current_entryno; -+ *entryno_ptr = new_default; - - /* Save the image in the disk. */ - if (! rawwrite (boot_drive, install_second_sector, buffer)) -@@ -3129,6 +3133,117 @@ - } - - return 0; -+} -+#endif -+ -+#if !defined(SUPPORT_DISKLESS) && defined(GRUB_UTIL) -+/* -+ * Full implementation of new `savedefault' for GRUB shell. -+ * XXX This needs fixing for stage2 files which aren't accessible -+ * through a mounted filesystem. -+ */ -+static int -+savedefault_shell(char *arg, int flags) -+{ -+ char *stage2_os_file = "/boot/grub/stage2"; /* Default filename */ -+ FILE *fp; -+ char buffer[512]; -+ int *entryno_ptr; -+ int new_default = 0; -+ -+ while (1) -+ { -+ if (grub_memcmp ("--stage2=", arg, sizeof ("--stage2=") - 1) == 0) -+ { -+ stage2_os_file = arg + sizeof ("--stage2=") - 1; -+ arg = skip_to (0, arg); -+ nul_terminate (stage2_os_file); -+ } -+ else if (grub_memcmp ("--default=", arg, sizeof ("--default=") - 1) == 0) -+ { -+ char *p = arg + sizeof ("--default=") - 1; -+ if (! safe_parse_maxint (&p, &new_default)) -+ return 1; -+ arg = skip_to (0, arg); -+ } -+ else if (grub_memcmp ("--once", arg, sizeof ("--once") - 1) == 0) -+ { -+ new_default |= STAGE2_ONCEONLY_ENTRY; -+ arg = skip_to (0, arg); -+ } -+ else -+ break; -+ } -+ -+ if (! (fp = fopen(stage2_os_file, "r+"))) -+ { -+ errnum = ERR_FILE_NOT_FOUND; -+ return 1; -+ } -+ -+ if (fseek (fp, SECTOR_SIZE, SEEK_SET) != 0) -+ { -+ fclose (fp); -+ errnum = ERR_BAD_VERSION; -+ return 1; -+ } -+ -+ if (fread (buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE) -+ { -+ fclose (fp); -+ errnum = ERR_READ; -+ return 1; -+ } -+ -+ /* Sanity check. */ -+ if (buffer[STAGE2_STAGE2_ID] != STAGE2_ID_STAGE2 -+ || *((short *) (buffer + STAGE2_VER_MAJ_OFFS)) != COMPAT_VERSION) -+ { -+ errnum = ERR_BAD_VERSION; -+ return 1; -+ } -+ -+ entryno_ptr = (int *) (buffer + STAGE2_SAVED_ENTRYNO); -+ *entryno_ptr = new_default; -+ -+ if (fseek (fp, SECTOR_SIZE, SEEK_SET) != 0) -+ { -+ fclose (fp); -+ errnum = ERR_BAD_VERSION; -+ return 1; -+ } -+ -+ if (fwrite (buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE) -+ { -+ fclose (fp); -+ errnum = ERR_WRITE; -+ return 1; -+ } -+ -+ (void)fflush (fp); -+ fclose (fp); -+ return 0; -+} -+#endif -+ -+/* savedefault */ -+static int -+savedefault_func (char *arg, int flags) -+{ -+#if !defined(SUPPORT_DISKLESS) -+#if !defined(GRUB_UTIL) -+ /* This command is only useful when you boot an entry from the menu -+ interface. */ -+ if (! (flags & BUILTIN_SCRIPT)) -+ { -+ errnum = ERR_UNRECOGNIZED; -+ return 1; -+ } -+ -+ return savedefault_helper(current_entryno); -+#else /* defined(GRUB_UTIL) */ -+ return savedefault_shell(arg, flags); -+#endif - #else /* ! SUPPORT_DISKLESS && ! GRUB_UTIL */ - errnum = ERR_UNRECOGNIZED; - return 1; -@@ -3140,8 +3255,14 @@ - "savedefault", - savedefault_func, - BUILTIN_CMDLINE, -+#ifdef GRUB_UTIL -+ "savedefault [--stage2=STAGE2_FILE] [--default=DEFAULT] [--once]", -+ "Save DEFAULT as the default boot entry in STAGE2_FILE. If '--once'" -+ " is specified, the default is reset after the next reboot." -+#else - "savedefault", - "Save the current entry as the default boot entry." -+#endif - }; - - -@@ -4217,6 +4338,15 @@ - static int - timeout_func (char *arg, int flags) - { -+ /* One-shot default shenanigans -- don't piss around with the menu! */ -+ if (grub_timeout != -1) -+ return 0; -+ if ((saved_entryno & STAGE2_ONCEONLY_ENTRY) != 0) -+ { -+ grub_timeout = 0; -+ return 0; -+ } -+ - if (! safe_parse_maxint (&arg, &grub_timeout)) - return 1; - -diff -urBP grub-0.90-old/stage2/shared.h grub-0.90-modified/stage2/shared.h ---- grub-0.90-old/stage2/shared.h Fri Feb 22 11:59:53 2002 -+++ grub-0.90-modified/stage2/shared.h Fri Feb 22 10:51:49 2002 -@@ -199,6 +199,8 @@ - #define STAGE2_FORCE_LBA 0x11 - #define STAGE2_VER_STR_OFFS 0x12 - -+#define STAGE2_ONCEONLY_ENTRY 0x10000 -+ - /* Stage 2 identifiers */ - #define STAGE2_ID_STAGE2 0 - #define STAGE2_ID_FFS_STAGE1_5 1 - -_______________________________________________ -Bug-grub mailing list -Bug-grub@gnu.org -http://mail.gnu.org/mailman/listinfo/bug-grub |