]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/grub-0.91-bootonce.patch
Samba-Update von Maniac...
[people/pmueller/ipfire-2.x.git] / src / patches / grub-0.91-bootonce.patch
CommitLineData
cd1a2927
MT
1To: bug-grub@gnu.org
2cc: Keir.Fraser@cl.cam.ac.uk
3Subject: PATCH (updated): 'lilo -R' functionality
4From: Keir Fraser <Keir.Fraser@cl.cam.ac.uk>
5Message-Id: <E16iFu3-0002VK-00@wisbech.cl.cam.ac.uk>
6
7The following is a slight modification to the patch I submitted a week
8or so ago. This will cause GRUB to skip displaying the boot menu if a
9one-shot default has been specified (just as lilo does with '-R').
10
11Same caveats as for previous patch:
12 * The new 'savedefault' function in the GRUB shell is incomplete.
13 Only works if the filesystem containing stage2 file is mounted.
14 * Patch is against grub-0.90, but patches directly to 0.91
15
16I hope this goes into CVS in the next round of updates :-)
17
18 -- Keir Fraser
19
20
21
22diff -urBP grub-0.90-old/stage2/builtins.c grub-0.90-modified/stage2/builtins.c
23--- grub-0.90-old/stage2/builtins.c Fri Feb 22 11:59:57 2002
24+++ grub-0.90-modified/stage2/builtins.c Fri Feb 22 13:48:36 2002
25@@ -785,6 +785,17 @@
26 default_func (char *arg, int flags)
27 {
28 #ifndef SUPPORT_DISKLESS
29+#ifndef GRUB_UTIL
30+ /* Has a forced once-only default been specified? */
31+ static int savedefault_helper(int);
32+ if ((saved_entryno & STAGE2_ONCEONLY_ENTRY) != 0)
33+ {
34+ grub_timeout = 0;
35+ default_entry = saved_entryno & ~STAGE2_ONCEONLY_ENTRY;
36+ savedefault_helper(0);
37+ return 0;
38+ }
39+#endif
40 if (grub_strcmp (arg, "saved") == 0)
41 {
42 default_entry = saved_entryno;
43@@ -3074,22 +3085,15 @@
44 };
45
46 \f
47-/* savedefault */
48+
49+#if !defined(SUPPORT_DISKLESS) && !defined(GRUB_UTIL)
50+/* Write specified default entry number into stage2 file. */
51 static int
52-savedefault_func (char *arg, int flags)
53+savedefault_helper(int new_default)
54 {
55-#if !defined(SUPPORT_DISKLESS) && !defined(GRUB_UTIL)
56 char buffer[512];
57 int *entryno_ptr;
58-
59- /* This command is only useful when you boot an entry from the menu
60- interface. */
61- if (! (flags & BUILTIN_SCRIPT))
62- {
63- errnum = ERR_UNRECOGNIZED;
64- return 1;
65- }
66-
67+
68 /* Get the geometry of the boot drive (i.e. the disk which contains
69 this stage2). */
70 if (get_diskinfo (boot_drive, &buf_geom))
71@@ -3115,10 +3119,10 @@
72 entryno_ptr = (int *) (buffer + STAGE2_SAVED_ENTRYNO);
73
74 /* Check if the saved entry number differs from current entry number. */
75- if (*entryno_ptr != current_entryno)
76+ if (*entryno_ptr != new_default)
77 {
78 /* Overwrite the saved entry number. */
79- *entryno_ptr = current_entryno;
80+ *entryno_ptr = new_default;
81
82 /* Save the image in the disk. */
83 if (! rawwrite (boot_drive, install_second_sector, buffer))
84@@ -3129,6 +3133,117 @@
85 }
86
87 return 0;
88+}
89+#endif
90+
91+#if !defined(SUPPORT_DISKLESS) && defined(GRUB_UTIL)
92+/*
93+ * Full implementation of new `savedefault' for GRUB shell.
94+ * XXX This needs fixing for stage2 files which aren't accessible
95+ * through a mounted filesystem.
96+ */
97+static int
98+savedefault_shell(char *arg, int flags)
99+{
100+ char *stage2_os_file = "/boot/grub/stage2"; /* Default filename */
101+ FILE *fp;
102+ char buffer[512];
103+ int *entryno_ptr;
104+ int new_default = 0;
105+
106+ while (1)
107+ {
108+ if (grub_memcmp ("--stage2=", arg, sizeof ("--stage2=") - 1) == 0)
109+ {
110+ stage2_os_file = arg + sizeof ("--stage2=") - 1;
111+ arg = skip_to (0, arg);
112+ nul_terminate (stage2_os_file);
113+ }
114+ else if (grub_memcmp ("--default=", arg, sizeof ("--default=") - 1) == 0)
115+ {
116+ char *p = arg + sizeof ("--default=") - 1;
117+ if (! safe_parse_maxint (&p, &new_default))
118+ return 1;
119+ arg = skip_to (0, arg);
120+ }
121+ else if (grub_memcmp ("--once", arg, sizeof ("--once") - 1) == 0)
122+ {
123+ new_default |= STAGE2_ONCEONLY_ENTRY;
124+ arg = skip_to (0, arg);
125+ }
126+ else
127+ break;
128+ }
129+
130+ if (! (fp = fopen(stage2_os_file, "r+")))
131+ {
132+ errnum = ERR_FILE_NOT_FOUND;
133+ return 1;
134+ }
135+
136+ if (fseek (fp, SECTOR_SIZE, SEEK_SET) != 0)
137+ {
138+ fclose (fp);
139+ errnum = ERR_BAD_VERSION;
140+ return 1;
141+ }
142+
143+ if (fread (buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
144+ {
145+ fclose (fp);
146+ errnum = ERR_READ;
147+ return 1;
148+ }
149+
150+ /* Sanity check. */
151+ if (buffer[STAGE2_STAGE2_ID] != STAGE2_ID_STAGE2
152+ || *((short *) (buffer + STAGE2_VER_MAJ_OFFS)) != COMPAT_VERSION)
153+ {
154+ errnum = ERR_BAD_VERSION;
155+ return 1;
156+ }
157+
158+ entryno_ptr = (int *) (buffer + STAGE2_SAVED_ENTRYNO);
159+ *entryno_ptr = new_default;
160+
161+ if (fseek (fp, SECTOR_SIZE, SEEK_SET) != 0)
162+ {
163+ fclose (fp);
164+ errnum = ERR_BAD_VERSION;
165+ return 1;
166+ }
167+
168+ if (fwrite (buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
169+ {
170+ fclose (fp);
171+ errnum = ERR_WRITE;
172+ return 1;
173+ }
174+
175+ (void)fflush (fp);
176+ fclose (fp);
177+ return 0;
178+}
179+#endif
180+
181+/* savedefault */
182+static int
183+savedefault_func (char *arg, int flags)
184+{
185+#if !defined(SUPPORT_DISKLESS)
186+#if !defined(GRUB_UTIL)
187+ /* This command is only useful when you boot an entry from the menu
188+ interface. */
189+ if (! (flags & BUILTIN_SCRIPT))
190+ {
191+ errnum = ERR_UNRECOGNIZED;
192+ return 1;
193+ }
194+
195+ return savedefault_helper(current_entryno);
196+#else /* defined(GRUB_UTIL) */
197+ return savedefault_shell(arg, flags);
198+#endif
199 #else /* ! SUPPORT_DISKLESS && ! GRUB_UTIL */
200 errnum = ERR_UNRECOGNIZED;
201 return 1;
202@@ -3140,8 +3255,14 @@
203 "savedefault",
204 savedefault_func,
205 BUILTIN_CMDLINE,
206+#ifdef GRUB_UTIL
207+ "savedefault [--stage2=STAGE2_FILE] [--default=DEFAULT] [--once]",
208+ "Save DEFAULT as the default boot entry in STAGE2_FILE. If '--once'"
209+ " is specified, the default is reset after the next reboot."
210+#else
211 "savedefault",
212 "Save the current entry as the default boot entry."
213+#endif
214 };
215
216 \f
217@@ -4217,6 +4338,15 @@
218 static int
219 timeout_func (char *arg, int flags)
220 {
221+ /* One-shot default shenanigans -- don't piss around with the menu! */
222+ if (grub_timeout != -1)
223+ return 0;
224+ if ((saved_entryno & STAGE2_ONCEONLY_ENTRY) != 0)
225+ {
226+ grub_timeout = 0;
227+ return 0;
228+ }
229+
230 if (! safe_parse_maxint (&arg, &grub_timeout))
231 return 1;
232
233diff -urBP grub-0.90-old/stage2/shared.h grub-0.90-modified/stage2/shared.h
234--- grub-0.90-old/stage2/shared.h Fri Feb 22 11:59:53 2002
235+++ grub-0.90-modified/stage2/shared.h Fri Feb 22 10:51:49 2002
236@@ -199,6 +199,8 @@
237 #define STAGE2_FORCE_LBA 0x11
238 #define STAGE2_VER_STR_OFFS 0x12
239
240+#define STAGE2_ONCEONLY_ENTRY 0x10000
241+
242 /* Stage 2 identifiers */
243 #define STAGE2_ID_STAGE2 0
244 #define STAGE2_ID_FFS_STAGE1_5 1
245
246_______________________________________________
247Bug-grub mailing list
248Bug-grub@gnu.org
249http://mail.gnu.org/mailman/listinfo/bug-grub