Annotation of /trunk/grub/patches/grub-0.97-append.patch
Parent Directory | Revision Log
Revision 144 -
(hide annotations)
(download)
Tue May 8 20:06:05 2007 UTC (17 years, 4 months ago) by niro
File size: 2909 byte(s)
Tue May 8 20:06:05 2007 UTC (17 years, 4 months ago) by niro
File size: 2909 byte(s)
-import
1 | niro | 144 | --- grub-0.90/stage2/stage2.c.append Thu Dec 20 08:20:48 2001 |
2 | +++ grub-0.90/stage2/stage2.c Thu Dec 20 17:01:20 2001 | ||
3 | @@ -500,7 +500,8 @@ | ||
4 | if (config_entries) | ||
5 | printf ("\ | ||
6 | Press enter to boot the selected OS, \'e\' to edit the\n\ | ||
7 | - commands before booting, or \'c\' for a command-line."); | ||
8 | + commands before booting, \'a\' to modify the kernel arguments\n\ | ||
9 | + before booting, or \'c\' for a command-line."); | ||
10 | else | ||
11 | printf ("\ | ||
12 | Press \'b\' to boot, \'e\' to edit the selected command in the\n\ | ||
13 | @@ -787,6 +788,98 @@ | ||
14 | enter_cmdline (heap, 0); | ||
15 | goto restart; | ||
16 | } | ||
17 | + if (config_entries && c == 'a') | ||
18 | + { | ||
19 | + int new_num_entries = 0, i = 0, j; | ||
20 | + int needs_padding, amount; | ||
21 | + char *new_heap; | ||
22 | + char * entries; | ||
23 | + char * entry_copy; | ||
24 | + char * append_line; | ||
25 | + char * start; | ||
26 | + | ||
27 | + entry_copy = new_heap = heap; | ||
28 | + cur_entry = get_entry (config_entries, first_entry + entryno, | ||
29 | + 1); | ||
30 | + | ||
31 | + do | ||
32 | + { | ||
33 | + while ((*(new_heap++) = cur_entry[i++]) != 0); | ||
34 | + new_num_entries++; | ||
35 | + } | ||
36 | + while (config_entries && cur_entry[i]); | ||
37 | + | ||
38 | + /* this only needs to be done if config_entries is non-NULL, | ||
39 | + but it doesn't hurt to do it always */ | ||
40 | + *(new_heap++) = 0; | ||
41 | + | ||
42 | + new_heap = heap + NEW_HEAPSIZE + 1; | ||
43 | + | ||
44 | + entries = entry_copy; | ||
45 | + while (*entries) | ||
46 | + { | ||
47 | + if ((strstr(entries, "kernel") == entries) && | ||
48 | + isspace(entries[6])) | ||
49 | + break; | ||
50 | + | ||
51 | + while (*entries) entries++; | ||
52 | + entries++; | ||
53 | + } | ||
54 | + | ||
55 | + if (!*entries) | ||
56 | + goto restart; | ||
57 | + | ||
58 | + start = entries + 6; | ||
59 | + | ||
60 | + /* skip the white space */ | ||
61 | + while (*start && isspace(*start)) start++; | ||
62 | + /* skip the kernel name */ | ||
63 | + while (*start && !isspace(*start)) start++; | ||
64 | + | ||
65 | + /* skip the white space */ | ||
66 | + needs_padding = (!*start || !isspace(*start)); | ||
67 | + while (*start && isspace(*start)) start++; | ||
68 | + | ||
69 | + append_line = new_heap; | ||
70 | + grub_strcpy(append_line, start); | ||
71 | + | ||
72 | + cls(); | ||
73 | + print_cmdline_message (CMDLINE_EDIT_MODE); | ||
74 | + | ||
75 | + if (get_cmdline(PACKAGE " append> ", | ||
76 | + append_line, NEW_HEAPSIZE + 1, | ||
77 | + 0, 1)) | ||
78 | + goto restart; | ||
79 | + | ||
80 | + /* have new args; append_line points to the | ||
81 | + new args and start points to the old | ||
82 | + args */ | ||
83 | + | ||
84 | + i = grub_strlen(start); | ||
85 | + j = grub_strlen(append_line); | ||
86 | + | ||
87 | + if (i > (j + needs_padding)) | ||
88 | + amount = i; | ||
89 | + else | ||
90 | + amount = j + needs_padding; | ||
91 | + | ||
92 | + /* align rest of commands properly */ | ||
93 | + memmove (start + j + needs_padding, start + i, | ||
94 | + ((int) append_line) - ((int) start) - (amount)); | ||
95 | + | ||
96 | + if (needs_padding) | ||
97 | + *start = ' '; | ||
98 | + | ||
99 | + /* copy command to correct area */ | ||
100 | + memmove (start + needs_padding, append_line, j); | ||
101 | + | ||
102 | + /* set up this entry to boot */ | ||
103 | + config_entries = NULL; | ||
104 | + cur_entry = entry_copy; | ||
105 | + heap = new_heap; | ||
106 | + | ||
107 | + break; | ||
108 | + } | ||
109 | #ifdef GRUB_UTIL | ||
110 | if (c == 'q') | ||
111 | { |