This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "IPFire 2.x development tree".
The branch, next has been updated
via 82705b6e9953f42d91ecdcfa516bd6adfa5183d3 (commit)
from 5ab7c89392bd2758e42484ee9528540f04d7d3f9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 82705b6e9953f42d91ecdcfa516bd6adfa5183d3
Author: Michael Tremer <michael.tremer(a)ipfire.org>
Date: Sun Mar 7 23:45:06 2010 +0100
Add some patches to grub.
-----------------------------------------------------------------------
Summary of changes:
lfs/grub | 42 ++-
src/patches/grub-0.90-append.patch | 111 ++++
src/patches/grub-0.90-symlinkmenulst.patch | 16 +
src/patches/grub-0.93-configfile.patch | 75 +++
src/patches/grub-0.93-endedit.patch | 77 +++
src/patches/grub-0.94-installcopyonly.patch | 85 +++
src/patches/grub-0.95-hiddenmenu-tweak.patch | 39 ++
src/patches/grub-0.95-md-mbr.patch | 11 +
src/patches/grub-0.95-md-rework.patch | 183 ++++++
src/patches/grub-0.95-md.patch | 183 ++++++
src/patches/grub-0.95-nonmbr.patch | 14 +
src/patches/grub-0.95-odirect.patch | 115 ++++
src/patches/grub-0.95-recheck-bad.patch | 83 +++
src/patches/grub-0.95-staticcurses.patch | 14 +
src/patches/grub-0.97-bz429187-cciss.patch | 75 +++
src/patches/grub-0.97-cmdline-size.patch | 45 ++
src/patches/grub-0.97-datadir.patch | 229 ++++++++
src/patches/grub-0.97-dmraid-partition-names.patch | 10 +
src/patches/grub-0.97-dmraid-recheck-bad.patch | 17 +
src/patches/grub-0.97-dmraid.patch | 92 +++
src/patches/grub-0.97-install.in.patch | 34 ++
src/patches/grub-0.97-mactel-kbd.patch | 100 ++++
src/patches/grub-0.97-mdadm-path.patch | 27 +
src/patches/grub-0.97-mpath.patch | 18 +
src/patches/grub-0.97-nx-multiinstall.patch | 60 ++
src/patches/grub-0.97-nxstack.patch | 615 ++++++++++++++++++++
src/patches/grub-0.97-once.patch | 513 ++++++++++++++++
src/patches/grub-0.97-prototypes.patch | 11 +
src/patches/grub-0.97-stderr.patch | 102 ++++
29 files changed, 2990 insertions(+), 6 deletions(-)
create mode 100644 src/patches/grub-0.90-append.patch
create mode 100644 src/patches/grub-0.90-symlinkmenulst.patch
create mode 100644 src/patches/grub-0.93-configfile.patch
create mode 100644 src/patches/grub-0.93-endedit.patch
create mode 100644 src/patches/grub-0.94-installcopyonly.patch
create mode 100644 src/patches/grub-0.95-hiddenmenu-tweak.patch
create mode 100644 src/patches/grub-0.95-md-mbr.patch
create mode 100644 src/patches/grub-0.95-md-rework.patch
create mode 100644 src/patches/grub-0.95-md.patch
create mode 100644 src/patches/grub-0.95-nonmbr.patch
create mode 100644 src/patches/grub-0.95-odirect.patch
create mode 100644 src/patches/grub-0.95-recheck-bad.patch
create mode 100644 src/patches/grub-0.95-staticcurses.patch
create mode 100644 src/patches/grub-0.97-bz429187-cciss.patch
create mode 100644 src/patches/grub-0.97-cmdline-size.patch
create mode 100644 src/patches/grub-0.97-datadir.patch
create mode 100644 src/patches/grub-0.97-dmraid-partition-names.patch
create mode 100644 src/patches/grub-0.97-dmraid-recheck-bad.patch
create mode 100644 src/patches/grub-0.97-dmraid.patch
create mode 100644 src/patches/grub-0.97-install.in.patch
create mode 100644 src/patches/grub-0.97-mactel-kbd.patch
create mode 100644 src/patches/grub-0.97-mdadm-path.patch
create mode 100644 src/patches/grub-0.97-mpath.patch
create mode 100644 src/patches/grub-0.97-nx-multiinstall.patch
create mode 100644 src/patches/grub-0.97-nxstack.patch
create mode 100644 src/patches/grub-0.97-once.patch
create mode 100644 src/patches/grub-0.97-prototypes.patch
create mode 100644 src/patches/grub-0.97-stderr.patch
Difference in files:
diff --git a/lfs/grub b/lfs/grub
index ed801f8..8b9f0eb 100644
--- a/lfs/grub
+++ b/lfs/grub
@@ -73,15 +73,45 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-disk_geometry-1.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-graphics.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.90-append.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.90-symlinkmenulst.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.91-splashimagehelp.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.93-configfile.patch
+ cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/grub-0.93-endedit.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.93-graphics-bootterm.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-xpmjunk.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-splash-error-term.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.93-special-device-names.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-moreraid.patch
cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.94-i2o.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97_grub-install_virtio.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-graphics.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-hiddenmenu-tweak.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-md.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-md-rework.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-md-mbr.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-moreraid.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-nonmbr.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-odirect.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-recheck-bad.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-staticcurses.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-xpmjunk.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-cmdline-size.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-datadir.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-dmraid.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-dmraid-partition-names.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-install.in.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-mactel-kbd.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-mpath.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-nxstack.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-nx-multiinstall.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-once.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.95-splash-error-term.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.94-installcopyonly.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-prototypes.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-stderr.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-bz429187-cciss.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-dmraid-recheck-bad.patch
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-mdadm-path.patch
+
+ # XXX Does not work anymore
+ #cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97_grub-install_virtio.patch
cd $(DIR_APP) && perl -pi -e 's,/usr/lib/grub/i386-pc,/usr/share/grub/i386-pc,' docs/grub.texi
cd $(DIR_APP) && sed -i 's/AM_INIT_AUTOMAKE/&\nAM_PROG_AS/' configure.ac
@@ -94,7 +124,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
# grub files
mkdir -vp /boot/grub
- cp -v /usr/lib/grub/i386-pc/stage{1,2} /boot/grub
+ cp -v /usr/share/grub/i386-pc/stage{1,2} /boot/grub
for i in $(DIR_SRC)/config/grub/*; do \
[ -f $$i ] && cp -f $$i /boot/grub; \
done
diff --git a/src/patches/grub-0.90-append.patch b/src/patches/grub-0.90-append.patch
new file mode 100644
index 0000000..88f79d0
--- /dev/null
+++ b/src/patches/grub-0.90-append.patch
@@ -0,0 +1,111 @@
+--- grub-0.90/stage2/stage2.c.append Thu Dec 20 08:20:48 2001
++++ grub-0.90/stage2/stage2.c Thu Dec 20 17:01:20 2001
+@@ -500,7 +500,8 @@
+ if (config_entries)
+ printf ("\
+ Press enter to boot the selected OS, \'e\' to edit the\n\
+- commands before booting, or \'c\' for a command-line.");
++ commands before booting, \'a\' to modify the kernel arguments\n\
++ before booting, or \'c\' for a command-line.");
+ else
+ printf ("\
+ Press \'b\' to boot, \'e\' to edit the selected command in the\n\
+@@ -787,6 +788,98 @@
+ enter_cmdline (heap, 0);
+ goto restart;
+ }
++ if (config_entries && c == 'a')
++ {
++ int new_num_entries = 0, i = 0, j;
++ int needs_padding, amount;
++ char *new_heap;
++ char * entries;
++ char * entry_copy;
++ char * append_line;
++ char * start;
++
++ entry_copy = new_heap = heap;
++ cur_entry = get_entry (config_entries, first_entry + entryno,
++ 1);
++
++ do
++ {
++ while ((*(new_heap++) = cur_entry[i++]) != 0);
++ new_num_entries++;
++ }
++ while (config_entries && cur_entry[i]);
++
++ /* this only needs to be done if config_entries is non-NULL,
++ but it doesn't hurt to do it always */
++ *(new_heap++) = 0;
++
++ new_heap = heap + NEW_HEAPSIZE + 1;
++
++ entries = entry_copy;
++ while (*entries)
++ {
++ if ((strstr(entries, "kernel") == entries) &&
++ isspace(entries[6]))
++ break;
++
++ while (*entries) entries++;
++ entries++;
++ }
++
++ if (!*entries)
++ goto restart;
++
++ start = entries + 6;
++
++ /* skip the white space */
++ while (*start && isspace(*start)) start++;
++ /* skip the kernel name */
++ while (*start && !isspace(*start)) start++;
++
++ /* skip the white space */
++ needs_padding = (!*start || !isspace(*start));
++ while (*start && isspace(*start)) start++;
++
++ append_line = new_heap;
++ grub_strcpy(append_line, start);
++
++ cls();
++ print_cmdline_message (CMDLINE_EDIT_MODE);
++
++ if (get_cmdline(PACKAGE " append> ",
++ append_line, NEW_HEAPSIZE + 1,
++ 0, 1))
++ goto restart;
++
++ /* have new args; append_line points to the
++ new args and start points to the old
++ args */
++
++ i = grub_strlen(start);
++ j = grub_strlen(append_line);
++
++ if (i > (j + needs_padding))
++ amount = i;
++ else
++ amount = j + needs_padding;
++
++ /* align rest of commands properly */
++ memmove (start + j + needs_padding, start + i,
++ ((int) append_line) - ((int) start) - (amount));
++
++ if (needs_padding)
++ *start = ' ';
++
++ /* copy command to correct area */
++ memmove (start + needs_padding, append_line, j);
++
++ /* set up this entry to boot */
++ config_entries = NULL;
++ cur_entry = entry_copy;
++ heap = new_heap;
++
++ break;
++ }
+ #ifdef GRUB_UTIL
+ if (c == 'q')
+ {
diff --git a/src/patches/grub-0.90-symlinkmenulst.patch b/src/patches/grub-0.90-symlinkmenulst.patch
new file mode 100644
index 0000000..553d15a
--- /dev/null
+++ b/src/patches/grub-0.90-symlinkmenulst.patch
@@ -0,0 +1,16 @@
+Only in grub: ChangeLog~
+diff -ur grub-0.90/util/grub-install.in grub/util/grub-install.in
+--- grub-0.90/util/grub-install.in Wed Sep 5 15:50:06 2001
++++ grub/util/grub-install.in Wed Sep 5 15:50:24 2001
+@@ -320,6 +320,10 @@
+ exit 1
+ fi
+
++if ! test -e ${grubdir}/grub.conf ; then
++ test -e ${grubdir}/menu.lst && ln -s ./menu.lst ${grubdir}/grub.conf
++fi
++
+ # Create a safe temporary file.
+ test -x /bin/mktemp && log_file=`/bin/mktemp /tmp/grub-install.log.XXXXXX`
+
+Only in grub/util: grub-install.in.orig
diff --git a/src/patches/grub-0.93-configfile.patch b/src/patches/grub-0.93-configfile.patch
new file mode 100644
index 0000000..9cb1182
--- /dev/null
+++ b/src/patches/grub-0.93-configfile.patch
@@ -0,0 +1,75 @@
+--- grub-0.93/stage2/asm.S.config 2002-12-02 18:18:56.000000000 -0500
++++ grub-0.93/stage2/asm.S 2002-12-28 22:01:24.000000000 -0500
+@@ -97,7 +97,7 @@
+ .string VERSION
+ VARIABLE(config_file)
+ #ifndef STAGE1_5
+- .string "/boot/grub/menu.lst"
++ .string "/boot/grub/grub.conf"
+ #else /* STAGE1_5 */
+ .long 0xffffffff
+ .string "/boot/grub/stage2"
+--- grub-0.93/stage2/builtins.c.config 2002-12-03 23:41:57.000000000 -0500
++++ grub-0.93/stage2/builtins.c 2002-12-28 22:01:24.000000000 -0500
+@@ -3838,7 +3838,7 @@
+
+ /* The prefix was determined. */
+ grub_sprintf (stage2, "%s%s", prefix, "/stage2");
+- grub_sprintf (config_filename, "%s%s", prefix, "/menu.lst");
++ grub_sprintf (config_filename, "%s%s", prefix, "/grub.conf");
+ *real_config_filename = 0;
+
+ /* Check if stage2 exists. */
+--- grub-0.93/grub/asmstub.c.config 2002-12-02 18:20:45.000000000 -0500
++++ grub-0.93/grub/asmstub.c 2002-12-28 22:01:24.000000000 -0500
+@@ -71,7 +71,7 @@
+ unsigned long boot_drive = 0;
+ int saved_entryno = 0;
+ char version_string[] = VERSION;
+-char config_file[128] = "/boot/grub/menu.lst"; /* FIXME: arbitrary */
++char config_file[128] = "/boot/grub/grub.conf"; /* FIXME: arbitrary */
+ unsigned long linux_text_len = 0;
+ char *linux_data_tmp_addr = 0;
+ char *linux_data_real_addr = 0;
+--- grub-0.93/docs/grub.8.config 2002-12-07 22:17:59.000000000 -0500
++++ grub-0.93/docs/grub.8 2002-12-28 22:01:24.000000000 -0500
+@@ -15,7 +15,7 @@
+ specify stage2 boot_drive [default=0x0]
+ .TP
+ \fB\-\-config\-file\fR=\fIFILE\fR
+-specify stage2 config_file [default=/boot/grub/menu.lst]
++specify stage2 config_file [default=/boot/grub/grub.conf]
+ .TP
+ \fB\-\-device\-map\fR=\fIFILE\fR
+ use the device map file FILE
+--- grub-0.93/docs/grub.texi.config 2002-12-02 17:35:28.000000000 -0500
++++ grub-0.93/docs/grub.texi 2002-12-28 22:01:24.000000000 -0500
+@@ -989,7 +989,7 @@
+ keys) that will do everything to boot an OS.
+
+ To enable the menu, you need a configuration file,
+-(a)file{menu.lst} under the boot directory. We'll analyze an example
++(a)file{grub.conf} under the boot directory. We'll analyze an example
+ file.
+
+ The file first contains some general settings, the menu interface
+@@ -1596,8 +1596,8 @@
+
+ An absolute file name resembles a Unix absolute file name, using
+ @samp{/} for the directory separator (not @samp{\} as in DOS). One
+-example is @samp{(hd0,0)/boot/grub/menu.lst}. This means the file
+-(a)file{/boot/grub/menu.lst} in the first partition of the first hard
++example is @samp{(hd0,0)/boot/grub/grub.conf}. This means the file
++(a)file{/boot/grub/grub.conf} in the first partition of the first hard
+ disk. If you omit the device name in an absolute file name, GRUB uses
+ GRUB's @dfn{root device} implicitly. So if you set the root device to,
+ say, @samp{(hd1,0)} by the command @command{root} (@pxref{root}), then
+@@ -3249,7 +3249,7 @@
+
+ @item --config-file=@var{file}
+ Read the configuration file @var{file} instead of
+-(a)file{/boot/grub/menu.lst}. The format is the same as the normal GRUB
++(a)file{/boot/grub/grub.conf}. The format is the same as the normal GRUB
+ syntax. See @ref{Filesystem}, for more information.
+
+ @item --boot-drive=@var{drive}
diff --git a/src/patches/grub-0.93-endedit.patch b/src/patches/grub-0.93-endedit.patch
new file mode 100644
index 0000000..eb0463c
--- /dev/null
+++ b/src/patches/grub-0.93-endedit.patch
@@ -0,0 +1,77 @@
+Index: stage2/cmdline.c
+===================================================================
+RCS file: /cvsroot/grub/grub/stage2/cmdline.c,v
+retrieving revision 1.27
+diff -u -r1.27 cmdline.c
+--- stage2/cmdline.c 3 Dec 2002 00:02:53 -0000 1.27
++++ stage2/cmdline.c 6 Jan 2003 05:33:33 -0000
+@@ -48,12 +48,17 @@
+
+ /* Print a helpful message for the command-line interface. */
+ void
+-print_cmdline_message (int forever)
++print_cmdline_message (int type)
+ {
+ printf (" [ Minimal BASH-like line editing is supported. For the first word, TAB\n"
+ " lists possible command completions. Anywhere else TAB lists the possible\n"
+- " completions of a device/filename.%s ]\n",
+- (forever ? "" : " ESC at any time exits."));
++ " completions of a device/filename.");
++ if (type == CMDLINE_NORMAL_MODE)
++ printf(" ESC at any time exits.");
++ if (type == CMDLINE_EDIT_MODE)
++ printf(" ESC at any time cancels. ENTER \n"
++ " at any time accepts your changes.");
++ printf("]\n");
+ }
+
+ /* Find the builtin whose command name is COMMAND and return the
+@@ -128,7 +133,7 @@
+ print_network_configuration ();
+ grub_putchar ('\n');
+ #endif
+- print_cmdline_message (forever);
++ print_cmdline_message (forever ? CMDLINE_FOREVER_MODE : CMDLINE_NORMAL_MODE);
+
+ while (1)
+ {
+Index: stage2/shared.h
+===================================================================
+RCS file: /cvsroot/grub/grub/stage2/shared.h,v
+retrieving revision 1.90
+diff -u -r1.90 shared.h
+--- stage2/shared.h 3 Dec 2002 00:02:53 -0000 1.90
++++ stage2/shared.h 6 Jan 2003 05:33:33 -0000
+@@ -843,9 +843,15 @@
+ void init_config (void);
+ char *skip_to (int after_equal, char *cmdline);
+ struct builtin *find_command (char *command);
+-void print_cmdline_message (int forever);
+ void enter_cmdline (char *heap, int forever);
+ int run_script (char *script, char *heap);
++
++/* the flags for the cmdline message */
++#define CMDLINE_FOREVER_MODE 0x0
++#define CMDLINE_NORMAL_MODE 0x1
++#define CMDLINE_EDIT_MODE 0x2
++
++void print_cmdline_message (int type);
+ #endif
+
+ /* C library replacement functions with identical semantics. */
+Index: stage2/stage2.c
+===================================================================
+RCS file: /cvsroot/grub/grub/stage2/stage2.c,v
+retrieving revision 1.42
+diff -u -r1.42 stage2.c
+--- stage2/stage2.c 4 Dec 2002 00:55:45 -0000 1.42
++++ stage2/stage2.c 6 Jan 2003 05:33:33 -0000
+@@ -655,7 +655,7 @@
+ else
+ {
+ cls ();
+- print_cmdline_message (0);
++ print_cmdline_message (CMDLINE_EDIT_MODE);
+
+ new_heap = heap + NEW_HEAPSIZE + 1;
+
diff --git a/src/patches/grub-0.94-installcopyonly.patch b/src/patches/grub-0.94-installcopyonly.patch
new file mode 100644
index 0000000..a2e38fb
--- /dev/null
+++ b/src/patches/grub-0.94-installcopyonly.patch
@@ -0,0 +1,85 @@
+--- grub-0.94/util/grub-install.in.copyonly 2004-02-02 16:33:29.172127985 -0500
++++ grub-0.94/util/grub-install.in 2004-02-02 16:34:26.027454320 -0500
+@@ -40,6 +40,7 @@
+ force_lba=
+ recheck=no
+ debug=no
++justcopy=no
+
+ # look for secure tempfile creation wrappers on this platform
+ if test -x /bin/tempfile; then
+@@ -221,6 +222,17 @@
+ echo "$tmp_fname"
+ }
+
++copy_images() {
++ # Copy the GRUB images to the GRUB directory.
++ for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
++ rm -f $file || exit 1
++ done
++ for file in \
++ ${pkgdatadir}/stage1 ${pkgdatadir}/stage2 ${pkgdatadir}/*stage1_5; do
++ cp -f $file ${grubdir} || exit 1
++ done
++}
++
+ # Check the arguments.
+ for option in "$@"; do
+ case "$option" in
+@@ -240,6 +252,8 @@
+ force_lba="--force-lba" ;;
+ --recheck)
+ recheck=yes ;;
++ --just-copy)
++ justcopy=yes ;;
+ # This is an undocumented feature...
+ --debug)
+ debug=yes ;;
+@@ -258,12 +272,6 @@
+ esac
+ done
+
+-if test "x$install_device" = x; then
+- echo "install_device not specified." 1>&2
+- usage
+- exit 1
+-fi
+-
+ # If the debugging feature is enabled, print commands.
+ if test $debug = yes; then
+ set -x
+@@ -286,6 +294,18 @@
+ grubdir=${bootdir}/grub
+ device_map=${grubdir}/device.map
+
++# if they just want the images copied, copy the images and then exit
++if test $justcopy = yes; then
++ copy_images
++ exit 0
++fi
++
++if test "x$install_device" = x; then
++ echo "install_device not specified." 1>&2
++ usage
++ exit 1
++fi
++
+ # Check if GRUB is installed.
+ # This is necessary, because the user can specify "grub --read-only".
+ set $grub_shell dummy
+@@ -317,14 +337,7 @@
+ test -d "$bootdir" || mkdir "$bootdir" || exit 1
+ test -d "$grubdir" || mkdir "$grubdir" || exit 1
+
+-# Copy the GRUB images to the GRUB directory.
+-for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
+- rm -f $file || exit 1
+-done
+-for file in \
+- ${pkgdatadir}/stage1 ${pkgdatadir}/stage2 ${pkgdatadir}/*stage1_5; do
+- cp -f $file ${grubdir} || exit 1
+-done
++copy_images
+
+ # If --recheck is specified, remove the device map, if present.
+ if test $recheck = yes; then
diff --git a/src/patches/grub-0.95-hiddenmenu-tweak.patch b/src/patches/grub-0.95-hiddenmenu-tweak.patch
new file mode 100644
index 0000000..56fb083
--- /dev/null
+++ b/src/patches/grub-0.95-hiddenmenu-tweak.patch
@@ -0,0 +1,39 @@
+--- grub-0.95/stage2/stage2.c.hidden 2004-09-30 16:39:38.028893664 -0400
++++ grub-0.95/stage2/stage2.c 2004-09-30 16:42:07.981097464 -0400
+@@ -235,6 +235,8 @@
+ char *cur_entry = 0;
+ struct term_entry *prev_term = NULL;
+
++ cls();
++
+ /*
+ * Main loop for menu UI.
+ */
+@@ -262,14 +264,16 @@
+ /* Get current time. */
+ while ((time1 = getrtsecs ()) == 0xFF)
+ ;
++ grub_printf("\rPress any key to enter the menu\n\n\n");
+
+ while (1)
+ {
+ /* Check if ESC is pressed. */
+- if (checkkey () != -1 && ASCII_CHAR (getkey ()) == '\e')
++ if (checkkey () != -1)
+ {
+ grub_timeout = -1;
+ show_menu = 1;
++ getkey ();
+ break;
+ }
+
+@@ -288,7 +292,8 @@
+ grub_timeout--;
+
+ /* Print a message. */
+- grub_printf ("\rPress `ESC' to enter the menu... %d ",
++ grub_printf ("\rBooting %s in %d seconds...",
++ get_entry(menu_entries, first_entry + entryno, 0),
+ grub_timeout);
+ }
+ }
diff --git a/src/patches/grub-0.95-md-mbr.patch b/src/patches/grub-0.95-md-mbr.patch
new file mode 100644
index 0000000..1aaa3e9
--- /dev/null
+++ b/src/patches/grub-0.95-md-mbr.patch
@@ -0,0 +1,11 @@
+--- grub-0.95/util/grub-install.in.md-mbr 2005-02-20 17:56:48.000000000 -0500
++++ grub-0.95/util/grub-install.in 2005-02-20 17:57:12.000000000 -0500
+@@ -444,7 +444,7 @@
+ /dev/*)
+ install_device=`resolve_symlink "$install_device"`
+ for install_drive in `find_real_devs $install_device` ; do
+- install_drive=`convert $install_drive`
++ install_drive=`convert $install_drive | sed 's/,[0-9]*)/)/'`
+ if [ "x$install_drive" = "x" ]; then
+ exit 1
+ fi
diff --git a/src/patches/grub-0.95-md-rework.patch b/src/patches/grub-0.95-md-rework.patch
new file mode 100644
index 0000000..cff1977
--- /dev/null
+++ b/src/patches/grub-0.95-md-rework.patch
@@ -0,0 +1,183 @@
+--- grub-0.95/util/grub-install.in.md2 2005-01-03 14:49:18.133866107 -0500
++++ grub-0.95/util/grub-install.in 2005-01-03 16:35:44.923732271 -0500
+@@ -35,6 +35,7 @@
+ rootdir=
+ grub_prefix=/boot/grub
+
++install_drives=
+ install_device=
+ no_floppy=
+ force_lba=
+@@ -272,6 +273,30 @@
+ done
+ }
+
++
++dump_boot_block () {
++ sync
++ $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
++dump ${root_drive}${tmp} ${img_file}
++quit
++EOF
++}
++
++
++install_boot_block () {
++ # Before all invocations of the grub shell, call sync to make sure
++ # the raw device is in sync with any bufferring in filesystems.
++ sync
++
++ # Now perform the installation.
++ $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >>$log_file
++root $1
++setup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $2
++quit
++EOF
++}
++
++
+ # Check the arguments.
+ for option in "$@"; do
+ case "$option" in
+@@ -416,28 +441,32 @@
+ # Check for INSTALL_DEVICE.
+ case "$install_device" in
+ /dev/*)
+- # If we are running md on a Linux box, just use the first physical device
+- # at this point.
+ install_device=`resolve_symlink "$install_device"`
+- install_device=`find_real_devs $install_device | awk '{print $1}'`
+-
+- install_drive=`convert "$install_device"`
+- # I don't know why, but some shells wouldn't die if exit is
+- # called in a function.
+- if test "x$install_drive" = x; then
++ for install_drive in `find_real_devs $install_device` ; do
++ install_drive=`convert $install_drive`
++ if [ "x$install_drive" = "x" ]; then
++ exit 1
++ fi
++ install_drives="${install_drives} ${install_drive}"
++ done
++ unset install_drive
++
++ if test "x$install_drives" = x ; then
+ exit 1
+ fi ;;
+ \([hf]d[0-9]*\))
+- install_drive="$install_device" ;;
++ install_drives="$install_device" ;;
+ [hf]d[0-9]*)
+ # The GRUB format with no parenthesis.
+- install_drive="($install_device)" ;;
++ install_drives="($install_device)" ;;
+ *)
+ echo "Format of install_device not recognized." 1>&2
+ usage
+ exit 1 ;;
+ esac
+
++unset install_device
++
+ # Get the root drive.
+ root_device=`find_device ${rootdir}`
+ bootdir_device=`find_device ${bootdir}`
+@@ -465,41 +494,39 @@
+ test -n "$mkimg" && img_file=`$mkimg`
+ test -n "$mklog" && log_file=`$mklog`
+
+-for real_device in `find_real_devs $root_device`; do
+- # Convert the root deviceto a GRUB drive.
+- root_drive=`convert "$real_device"`
+- if [ "x$root_drive" = x ]; then
+- exit 1
+- fi
++# There's not a real root device, so just pick the first
++if is_raid1_device $root_device ; then
++ root_device=`find_real_devs $root_device | awk '{print $1}'`
++fi
+
+- for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
+- count=5
+- tmp=`echo $file | sed "s|^${grubdir}|${grub_prefix}|"`
+- while test $count -gt 0; do
+- sync
+- $grub_shell --batch $no_floppy --device-map=$device_map \
+- <<EOF >$log_file
+-dump ${root_drive}${tmp} ${img_file}
+-quit
+-EOF
+- if grep "Error [0-9]*: " $log_file >/dev/null; then
+- :
+- elif cmp $file $img_file >/dev/null; then
+- break
+- fi
+- sleep 1
+- count=`expr $count - 1`
+- done
+- if test $count -eq 0; then
+- echo "The file $file not read correctly." 1>&2
+- exit 1
+- fi
+- done
++# Convert the root deviceto a GRUB drive.
++root_drive=`convert "$root_device"`
++if [ "x$root_drive" = x ]; then
++ exit 1
++fi
+
+- rm -f $img_file
+- rm -f $log_file
++for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
++ count=5
++ tmp=`echo $file | sed "s|^${grubdir}|${grub_prefix}|"`
++ while test $count -gt 0; do
++ dump_boot_block $root_drive $img_file
++ if grep "Error [0-9]*: " $log_file >/dev/null; then
++ :
++ elif cmp $file $img_file >/dev/null; then
++ break
++ fi
++ sleep 1
++ count=`expr $count - 1`
++ done
++ if test $count -eq 0; then
++ echo "The file $file not read correctly." 1>&2
++ exit 1
++ fi
+ done
+
++rm -f $img_file
++rm -f $log_file
++
+ if ! test -e ${grubdir}/grub.conf ; then
+ test -e ${grubdir}/menu.lst && ln -s ./menu.lst ${grubdir}/grub.conf
+ fi
+@@ -507,24 +534,13 @@
+ # Create a safe temporary file.
+ test -n "$mklog" && log_file=`$mklog`
+
+-for real_device in `find_real_devs $root_device`; do
++for install_drive in $install_drives; do
+ # Convert the root deviceto a GRUB drive.
+- root_drive=`convert "$real_device"`
++ root_drive=`convert "$root_device"`
+ if [ "x$root_drive" = x ]; then
+ exit 1
+ fi
+-
+- # Before all invocations of the grub shell, call sync to make sure
+- # the raw device is in sync with any bufferring in filesystems.
+- sync
+-
+- # Now perform the installation.
+- $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >>$log_file
+-root $root_drive
+-setup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $root_drive
+-quit
+-EOF
+-
++ install_boot_block $root_drive $install_drive
+ done
+
+ if grep "Error [0-9]*: " $log_file >/dev/null ; then
diff --git a/src/patches/grub-0.95-md.patch b/src/patches/grub-0.95-md.patch
new file mode 100644
index 0000000..9e4ff89
--- /dev/null
+++ b/src/patches/grub-0.95-md.patch
@@ -0,0 +1,183 @@
+--- grub-0.95/util/grub-install.in.support_md 2004-12-17 17:50:45.000000000 -0500
++++ grub-0.95/util/grub-install.in 2004-12-19 19:19:20.509409160 -0500
+@@ -207,6 +207,43 @@
+ echo "$tmp_fname"
+ }
+
++# Usage: is_raid1_device devicename
++# Returns 0 if devicename is a raid1 md device, 1 if it is not.
++is_raid1_device () {
++ case "$host_os" in
++ linux*)
++ level=`mdadm --query --detail $1 2>/dev/null | \
++ awk '/Raid Level :/ {print $4}'`
++ if [ "$level" = "raid1" ]; then
++ return 0
++ fi
++ ;;
++ esac
++ return 1
++}
++
++# Usage: find_real_devs device
++# Returns space separated list of devices for linux if device is
++# a raid1 device. In all other cases, the provided value is returned.
++find_real_devs () {
++ source_device=$1
++ case "$host_os" in
++ linux*)
++ if is_raid1_device $source_device ; then
++ list=""
++ for device in `mdadm --query --detail "${source_device}" | \
++ awk '/\/dev\/[^(md)]/ {print $7}'` ; do
++ list="$list $device"
++ done
++ echo $list
++ return 0
++ fi
++ ;;
++ esac
++ echo $source_device
++ return 0
++}
++
+ # Usage: find_device file
+ # Find block device on which the file resides.
+ find_device () {
+@@ -219,7 +256,7 @@
+ exit 1
+ fi
+
+- tmp_fname=`resolve_symlink $tmp_fname`
++ tmp_fname=`resolve_symlink $tmp_fname`
+
+ echo "$tmp_fname"
+ }
+@@ -379,7 +416,11 @@
+ # Check for INSTALL_DEVICE.
+ case "$install_device" in
+ /dev/*)
++ # If we are running md on a Linux box, just use the first physical device
++ # at this point.
+ install_device=`resolve_symlink "$install_device"`
++ install_device=`find_real_devs $install_device | awk '{print $1}'`
++
+ install_drive=`convert "$install_device"`
+ # I don't know why, but some shells wouldn't die if exit is
+ # called in a function.
+@@ -408,14 +449,7 @@
+ grub_prefix="/grub"
+ fi
+
+-# Convert the root device to a GRUB drive.
+-root_drive=`convert "$root_device"`
+-if test "x$root_drive" = x; then
+- exit 1
+-fi
+-
+-# Check if the root directory exists in the same device as the grub
+-# directory.
++# Check if the root directory exists in the same device as the grub directory.
+ grubdir_device=`find_device ${grubdir}`
+
+ if test "x$grubdir_device" != "x$root_device"; then
+@@ -431,30 +465,40 @@
+ test -n "$mkimg" && img_file=`$mkimg`
+ test -n "$mklog" && log_file=`$mklog`
+
+-for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
+- count=5
+- tmp=`echo $file | sed "s|^${grubdir}|${grub_prefix}|"`
+- while test $count -gt 0; do
+- $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
++for real_device in `find_real_devs $root_device`; do
++ # Convert the root deviceto a GRUB drive.
++ root_drive=`convert "$real_device"`
++ if [ "x$root_drive" = x ]; then
++ exit 1
++ fi
++
++ for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
++ count=5
++ tmp=`echo $file | sed "s|^${grubdir}|${grub_prefix}|"`
++ while test $count -gt 0; do
++ sync
++ $grub_shell --batch $no_floppy --device-map=$device_map \
++ <<EOF >$log_file
+ dump ${root_drive}${tmp} ${img_file}
+ quit
+ EOF
+- if grep "Error [0-9]*: " $log_file >/dev/null; then
+- :
+- elif cmp $file $img_file >/dev/null; then
+- break
++ if grep "Error [0-9]*: " $log_file >/dev/null; then
++ :
++ elif cmp $file $img_file >/dev/null; then
++ break
++ fi
++ sleep 1
++ count=`expr $count - 1`
++ done
++ if test $count -eq 0; then
++ echo "The file $file not read correctly." 1>&2
++ exit 1
+ fi
+- sleep 1
+- count=`expr $count - 1`
+ done
+- if test $count -eq 0; then
+- echo "The file $file not read correctly." 1>&2
+- exit 1
+- fi
+-done
+
+-rm -f $img_file
+-rm -f $log_file
++ rm -f $img_file
++ rm -f $log_file
++done
+
+ if ! test -e ${grubdir}/grub.conf ; then
+ test -e ${grubdir}/menu.lst && ln -s ./menu.lst ${grubdir}/grub.conf
+@@ -463,21 +507,33 @@
+ # Create a safe temporary file.
+ test -n "$mklog" && log_file=`$mklog`
+
+-# Before all invocations of the grub shell, call sync to make sure
+-# the raw device is in sync with any bufferring in filesystems.
+-sync
++for real_device in `find_real_devs $root_device`; do
++ # Convert the root deviceto a GRUB drive.
++ root_drive=`convert "$real_device"`
++ if [ "x$root_drive" = x ]; then
++ exit 1
++ fi
++
++ # Before all invocations of the grub shell, call sync to make sure
++ # the raw device is in sync with any bufferring in filesystems.
++ sync
+
+-# Now perform the installation.
+-$grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
++ # Now perform the installation.
++ $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >>$log_file
+ root $root_drive
+-setup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $install_drive
++setup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $root_drive
+ quit
+ EOF
+
+-if grep "Error [0-9]*: " $log_file >/dev/null || test $debug = yes; then
++done
++
++if grep "Error [0-9]*: " $log_file >/dev/null ; then
+ cat $log_file 1>&2
+ exit 1
+ fi
++if test $debug = yes; then
++ cat $log_file 1>&2
++fi
+
+ rm -f $log_file
+
diff --git a/src/patches/grub-0.95-nonmbr.patch b/src/patches/grub-0.95-nonmbr.patch
new file mode 100644
index 0000000..35bd5f3
--- /dev/null
+++ b/src/patches/grub-0.95-nonmbr.patch
@@ -0,0 +1,14 @@
+--- grub-0.95/util/grub-install.in.nonmbr 2005-03-16 10:02:50.000000000 -0500
++++ grub-0.95/util/grub-install.in 2005-03-16 10:02:13.000000000 -0500
+@@ -444,7 +444,10 @@
+ /dev/*)
+ install_device=`resolve_symlink "$install_device"`
+ for install_drive in `find_real_devs $install_device` ; do
+- install_drive=`convert $install_drive | sed 's/,[0-9]*)/)/'`
++ install_drive=`convert $install_drive`
++ if is_raid1_device $install_device; then
++ install_drive=`echo $install_drive | sed 's/,[0-9]*)/)/'`
++ fi
+ if [ "x$install_drive" = "x" ]; then
+ exit 1
+ fi
diff --git a/src/patches/grub-0.95-odirect.patch b/src/patches/grub-0.95-odirect.patch
new file mode 100644
index 0000000..12dd9d9
--- /dev/null
+++ b/src/patches/grub-0.95-odirect.patch
@@ -0,0 +1,115 @@
+--- grub-0.95/grub/asmstub.c.odirect 2004-11-30 16:58:06.577019488 -0500
++++ grub-0.95/grub/asmstub.c 2004-11-30 16:59:56.057375944 -0500
+@@ -53,6 +53,9 @@
+ # ifndef BLKFLSBUF
+ # define BLKFLSBUF _IO (0x12,97) /* flush buffer cache */
+ # endif /* ! BLKFLSBUF */
++# ifndef O_DIRECT
++# define O_DIRECT 040000
++# endif /* ! O_DIRECT */
+ #endif /* __linux__ */
+
+ /* We want to prevent any circularararity in our stubs, as well as
+@@ -764,7 +767,7 @@
+ {
+ /* The unpartitioned device name: /dev/XdX */
+ char *devname = device_map[drive];
+- char buf[512];
++ char * buf, * buf_unaligned;
+
+ if (! devname)
+ return -1;
+@@ -775,13 +778,13 @@
+
+ /* Open read/write, or read-only if that failed. */
+ if (! read_only)
+- disks[drive].flags = open (devname, O_RDWR);
++ disks[drive].flags = open (devname, O_RDWR | O_DIRECT);
+
+ if (disks[drive].flags == -1)
+ {
+ if (read_only || errno == EACCES || errno == EROFS || errno == EPERM)
+ {
+- disks[drive].flags = open (devname, O_RDONLY);
++ disks[drive].flags = open (devname, O_RDONLY | O_DIRECT);
+ if (disks[drive].flags == -1)
+ {
+ assign_device_name (drive, 0);
+@@ -795,6 +798,10 @@
+ }
+ }
+
++ buf_unaligned = malloc((512 * sizeof(char)) + 4095);
++ buf = (char *) (((unsigned long)buf_unaligned + 4096 - 1) &
++ (~(4096-1)));
++
+ /* Attempt to read the first sector. */
+ if (read (disks[drive].flags, buf, 512) != 512)
+ {
+@@ -806,6 +813,7 @@
+
+ if (disks[drive].flags != -1)
+ get_drive_geometry (&disks[drive], device_map, drive);
++ free(buf_unaligned);
+ }
+
+ if (disks[drive].flags == -1)
+@@ -827,24 +835,34 @@
+ nread (int fd, char *buf, size_t len)
+ {
+ int size = len;
++ char * buf_unaligned, * buff, * obuff;
++ int ret;
++
++ buf_unaligned = malloc((len * sizeof(char)) + 4095);
++ obuff = buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) &
++ (~(4096-1)));
++
+
+ while (len)
+ {
+- int ret = read (fd, buf, len);
++ ret = read (fd, buff, len);
+
+ if (ret <= 0)
+ {
+ if (errno == EINTR)
+ continue;
+ else
+- return ret;
++ break;
+ }
+
+ len -= ret;
+- buf += ret;
++ buff += ret;
+ }
+
+- return size;
++ if (!len) ret = size;
++
++ buf = memcpy(buf, obuff, size);
++ return ret;
+ }
+
+ /* Write LEN bytes from BUF to FD. Return less than or equal to zero if an
+@@ -853,10 +871,18 @@
+ nwrite (int fd, char *buf, size_t len)
+ {
+ int size = len;
++ char * buf_unaligned, * buff;
++
++ buf_unaligned = malloc((len * sizeof(char)) + 4095);
++ buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) &
++ (~(4096-1)));
+
+ while (len)
+ {
+- int ret = write (fd, buf, len);
++ int ret;
++
++ memcpy(buff, buf, len);
++ ret = write (fd, buff, len);
+
+ if (ret <= 0)
+ {
diff --git a/src/patches/grub-0.95-recheck-bad.patch b/src/patches/grub-0.95-recheck-bad.patch
new file mode 100644
index 0000000..b55c6ae
--- /dev/null
+++ b/src/patches/grub-0.95-recheck-bad.patch
@@ -0,0 +1,83 @@
+--- grub-0.95/docs/grub.texi.recheck-bad 2005-07-25 17:55:57.000000000 -0400
++++ grub-0.95/docs/grub.texi 2005-07-25 17:58:00.000000000 -0400
+@@ -3417,8 +3417,9 @@
+
+ @item --recheck
+ Recheck the device map, even if @file{/boot/grub/device.map} already
+-exists. You should use this option whenever you add/remove a disk
+-into/from your computer.
++exists.
++
++This option is unreliable and its use is strongly discouraged.
+ @end table
+
+
+--- grub-0.95/util/grub-install.in.recheck-bad 2005-07-25 17:58:19.000000000 -0400
++++ grub-0.95/util/grub-install.in 2005-07-25 18:05:14.000000000 -0400
+@@ -68,6 +68,8 @@
+ --force-lba force GRUB to use LBA mode even for a buggy
+ BIOS
+ --recheck probe a device map even if it already exists
++ This flag is unreliable and its use is
++ strongly discouraged.
+
+ INSTALL_DEVICE can be a GRUB device name or a system device filename.
+
+@@ -328,7 +330,7 @@
+
+ # If --recheck is specified, remove the device map, if present.
+ if test $recheck = yes; then
+- rm -f $device_map
++ mv $device_map ${device_map}.backup
+ fi
+
+ # Create the device map file if it is not present.
+@@ -357,7 +359,22 @@
+ tmp=`sed -n '/^([fh]d[0-9]*)/s/\(^(.*)\).*/\1/p' $device_map \
+ | sort | uniq -d | sed -n 1p`
+ if test -n "$tmp"; then
+- echo "The drive $tmp is defined multiple times in the device map $device_map" 1>&2
++ echo "The drive $tmp is defined multiple times in the new device map." 1>&2
++ if test $recheck = yes; then
++ echo "Reverting to backed up copy." 1>&2
++ mv ${device_map}.backup $device_map
++ fi
++ exit 1
++fi
++
++# Make sure device.map has at least one hd device
++grep -q "^(hd[0-9]\+)" $device_map
++if [ "x$?" != "x0" ]; then
++ echo "No suitable drive was found in the generated device map." 1>&2
++ if test $recheck = yes; then
++ echo "Reverting to backed up copy." 1>&2
++ mv ${device_map}.backup $device_map
++ fi
+ exit 1
+ fi
+
+--- grub-0.95/docs/grub-install.8.recheck-bad 2004-06-13 13:44:59.000000000 -0400
++++ grub-0.95/docs/grub-install.8 2005-07-25 18:15:02.000000000 -0400
+@@ -30,6 +30,8 @@
+ .TP
+ \fB\-\-recheck\fR
+ probe a device map even if it already exists
++
++This option is unreliable and its use is strongly discouraged.
+ .PP
+ INSTALL_DEVICE can be a GRUB device name or a system device filename.
+ .SH "REPORTING BUGS"
+--- grub-0.95/docs/grub.info.recheck-bad 2004-05-11 08:22:54.000000000 -0400
++++ grub-0.95/docs/grub.info 2005-07-25 18:16:09.000000000 -0400
+@@ -3373,9 +3373,9 @@
+
+ `--recheck'
+ Recheck the device map, even if `/boot/grub/device.map' already
+- exists. You should use this option whenever you add/remove a disk
+- into/from your computer.
++ exists.
+
++ This option is unreliable and its use is strongly discouraged.
+
+ File: grub.info, Node: Invoking grub-md5-crypt, Next: Invoking grub-terminfo, Prev: Invoking grub-install, Up: Top
+
diff --git a/src/patches/grub-0.95-staticcurses.patch b/src/patches/grub-0.95-staticcurses.patch
new file mode 100644
index 0000000..ff87dd3
--- /dev/null
+++ b/src/patches/grub-0.95-staticcurses.patch
@@ -0,0 +1,14 @@
+--- grub-0.95/configure.ac.static 2004-06-13 13:38:17.000000000 -0400
++++ grub-0.95/configure.ac 2004-06-18 17:35:23.513374336 -0400
+@@ -207,9 +207,9 @@
+
+ # Unless the user specify --without-curses, check for curses.
+ if test "x$with_curses" != "xno"; then
+- AC_CHECK_LIB(ncurses, wgetch, [GRUB_LIBS="$GRUB_LIBS -lncurses"
++ AC_CHECK_LIB(ncurses, wgetch, [GRUB_LIBS="$GRUB_LIBS -Wl,-Bstatic -lncurses -Wl,-Bdynamic"
+ AC_DEFINE(HAVE_LIBCURSES, 1, [Define if you have a curses library])],
+- [AC_CHECK_LIB(curses, wgetch, [GRUB_LIBS="$GRUB_LIBS -lcurses"
++ [AC_CHECK_LIB(curses, wgetch, [GRUB_LIBS="$GRUB_LIBS -Wl,-Bstatic -lcurses -Wl,-Bdynamic"
+ AC_DEFINE(HAVE_LIBCURSES, 1, [Define if you have a curses library])])])
+ fi
+
diff --git a/src/patches/grub-0.97-bz429187-cciss.patch b/src/patches/grub-0.97-bz429187-cciss.patch
new file mode 100644
index 0000000..32f18bc
--- /dev/null
+++ b/src/patches/grub-0.97-bz429187-cciss.patch
@@ -0,0 +1,75 @@
+diff -up grub-0.97/util/grub-install.in.cciss grub-0.97/util/grub-install.in
+--- grub-0.97/util/grub-install.in.cciss 2008-02-04 14:30:31.000000000 -0500
++++ grub-0.97/util/grub-install.in 2008-02-07 18:34:14.000000000 -0500
+@@ -100,25 +100,56 @@ convert () {
+ # Break the device name into the disk part and the partition part.
+ case "$host_os" in
+ linux*)
++ # formats that need to be handled (disk name -> partition name):
++ # floppies: /dev/fd0
++ # normal sd/hd devices: /dev/hda -> /dev/hda3
++ # md: /dev/md0 -> /dev/md0p0
++ # ide raid devs: /dev/ide/host0/bus0/target0/lun0/disc
++ # -> /dev/ide/host0/bus0/target0/lun0/part1
++ # cciss: /dev/cciss/c0d0 -> /dev/cciss/c0d0p1
++ # mpath devs: /dev/mapper/mpath0 -> /dev/mapper/mpath0p1
++ # /dev/mapper/lalala -> /dev/mapper/lalalap1
++ # dmraid devs: /dev/mapper/via_abcdef -> /dev/mapper/via_abcdefp1
++ # /dev/mapper/isw_Volume0_abcdef -> /dev/mapper/isw_Volume0_abcdefp1
++ # the known list (to me) is (X means we should handle it):
++ # X asr_[unfettered crap]
++ # hpt[0-9]+x_[0-9]+-[0-9]+
++ # X hpt[0-9]+x_[0-9]+
++ # hpt[0-9]+x_SPARE
++ # isw_[a-z]+_[a-z]+[0-9]+
++ # X isw_[a-z]+
++ # jm_[0-9]+-[0-9]+
++ # X jm_[0-9]+
++ # lsi_[0-9]+-[0-9]+
++ # X lsi_[0-9]+
++ # nvidia_[a-z]+-[0-9]+
++ # X nvidia_[a-z]+
++ # pdc_[a-z]+-[0-9]+
++ # X pdc_[a-z]+
++ # sil_[0-9]+-[0-9]+
++ # X sil_[0-9]+
++ # via_[a-z]+-[0-9]+
++ # X via_[a-z]+
++ #
++ # more?
+ tmp_disk=`echo "$1" | grep -v '/mapper/control$' |
+- grep -v '/mapper/[[:alnum:]]\+-[[:alnum:]]\+$' | uniq |
++ grep -v '/mapper/[[:alnum:]_]\+-[[:digit:]]\+$' | uniq |
+ sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
+- -e 's%\(d[0-9]*\)p[0-9]*$%\1%' \
+- -e 's%\(fd[0-9]*\)$%\1%' \
+- -e 's%/part[0-9]*$%/disc%' \
+- -e 's%\(c[0-7]d[0-9]*\).*$%\1%' \
+- -e 's%\(/mapper/[[:alpha:]]\+[[:digit:]]\+\)p[[:digit:]]\+$%\1%' \
+- -e 's%\(/mapper/[[:alpha:]]\+_[[:alpha:]]\+\)[[:digit:]]\+$%\1%'`
++ -e 's%\(/c[0-9]\+d[0-9]\+\).*$%\1%' \
++ -e 's%\(fd[0-9]*\)$%\1%' \
++ -e 's%/part[0-9]*$%/disc%' \
++ -e 's%\(/mapper/[[:alnum:]_-]\+\)\+p[[:digit:]]\+$%\1%'\
++ -e 's%\(/mapper/[[:alnum:]]\+\(_[[:alnum:]]\+\)\+\)\p[[:digit:]]\+$%\1%'`
+ tmp_part=`echo "$1" | grep -v '/mapper/control$' |
+- grep -v '/mapper/[[:alnum:]]\+-[[:alnum:]]\+$' | uniq |
++ grep -v '/mapper/[[:alnum:]_]\+-[[:digit:]]\+$' | uniq |
+ sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \
+- -e 's%.*d[0-9]*p%%' \
+- -e 's%.*/fd[0-9]*$%%' \
+- -e 's%.*/floppy/[0-9]*$%%' \
+- -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
+- -e 's%.*c[0-7]d[0-9]*p%%' \
+- -e 's%.*/mapper/[[:alpha:]]\+[[:digit:]]\+p\([[:digit:]]\+\)$%\1%' \
+- -e 's%.*/mapper/[[:alpha:]]\+_[[:alpha:]]\+\([[:digit:]]\+\)$%\1%' |
++ -e 's%.*/c[0-9]\+d[0-9]\+p\([[:digit:]]\+\)%\1%' \
++ -e 's%.*/c[0-9]\+d[0-9]\+$%%' \
++ -e 's%.*/fd[0-9]\+$%%' \
++ -e 's%.*/floppy/[0-9]*$%%' \
++ -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
++ -e 's%.*/mapper/[[:alpha:]]\+[[:digit:]]\+p\([[:digit:]]\+\)$%\1%' \
++ -e 's%.*/mapper/[[:alnum:]]\+\(_[[:alpha:]]\+[[:digit:]]*\)\+p\([[:digit:]]\+\)$%\2%' |
+ grep -v '.*/mapper/.*'`
+ ;;
+ gnu*)
diff --git a/src/patches/grub-0.97-cmdline-size.patch b/src/patches/grub-0.97-cmdline-size.patch
new file mode 100644
index 0000000..e93aa98
--- /dev/null
+++ b/src/patches/grub-0.97-cmdline-size.patch
@@ -0,0 +1,45 @@
+diff --git a/stage2/boot.c b/stage2/boot.c
+index bf442e1..a6872e0 100644
+--- a/stage2/boot.c
++++ b/stage2/boot.c
+@@ -241,6 +241,7 @@ load_image (char *kernel, char *arg, kernel_t suggested_type,
+ }
+
+ if (lh->version >= 0x0202)
++ /* version 0x0202 and higher can handle 4096 */
+ lh->cmd_line_ptr = linux_data_real_addr + LINUX_CL_OFFSET;
+ else
+ {
+@@ -403,8 +404,10 @@ load_image (char *kernel, char *arg, kernel_t suggested_type,
+ {
+ char *src = skip_to (0, arg);
+ char *dest = linux_data_tmp_addr + LINUX_CL_OFFSET;
+-
+- while (dest < linux_data_tmp_addr + LINUX_CL_END_OFFSET && *src)
++ unsigned long cl_end_offset = lh->version < 0x0202 ?
++ LINUX_CL_END_OFFSET : LINUX_CL_END_OFFSET_202;
++
++ while (dest < linux_data_tmp_addr + cl_end_offset && *src)
+ *(dest++) = *(src++);
+
+ /* Old Linux kernels have problems determining the amount of
+diff --git a/stage2/shared.h b/stage2/shared.h
+index d05644b..c052480 100644
+--- a/stage2/shared.h
++++ b/stage2/shared.h
+@@ -160,10 +160,13 @@ extern void *grub_scratch_mem;
+ #define LINUX_VID_MODE_ASK 0xFFFD
+
+ #define LINUX_CL_OFFSET 0x9000
+-#define LINUX_CL_END_OFFSET 0x90FF
+-#define LINUX_SETUP_MOVE_SIZE 0x9100
+ #define LINUX_CL_MAGIC 0xA33F
+
++#define LINUX_CL_END_OFFSET 0x90FF
++#define LINUX_CL_END_OFFSET_202 0x9FFF /* version 0x0202 or higher */
++#define LINUX_SETUP_MOVE_SIZE 0xA000 /* where am I putting it? */
++
++
+ /*
+ * General disk stuff
+ */
diff --git a/src/patches/grub-0.97-datadir.patch b/src/patches/grub-0.97-datadir.patch
new file mode 100644
index 0000000..eaa89f0
--- /dev/null
+++ b/src/patches/grub-0.97-datadir.patch
@@ -0,0 +1,229 @@
+--- grub-0.97/stage1/Makefile.am.datadir 2005-12-14 11:07:01.000000000 -0500
++++ grub-0.97/stage1/Makefile.am 2005-12-14 11:07:21.000000000 -0500
+@@ -1,7 +1,7 @@
+-pkglibdir = $(libdir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
+-nodist_pkglib_DATA = stage1
++pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
++nodist_pkgdata_DATA = stage1
+
+-CLEANFILES = $(nodist_pkglib_DATA)
++CLEANFILES = $(nodist_pkgdata_DATA)
+
+ # We can't use builtins or standard includes.
+ AM_CCASFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
+--- grub-0.97/stage1/Makefile.in.datadir 2005-05-07 22:42:36.000000000 -0400
++++ grub-0.97/stage1/Makefile.in 2005-12-14 11:08:13.000000000 -0500
+@@ -1,8 +1,8 @@
+-# Makefile.in generated by automake 1.9.4 from Makefile.am.
++# Makefile.in generated by automake 1.9.6 from Makefile.am.
+ # @configure_input@
+
+ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+-# 2003, 2004 Free Software Foundation, Inc.
++# 2003, 2004, 2005 Free Software Foundation, Inc.
+ # This Makefile.in is free software; the Free Software Foundation
+ # gives unlimited permission to copy and/or distribute it,
+ # with or without modifications, as long as this notice is preserved.
+@@ -15,8 +15,6 @@
+ @SET_MAKE@
+
+
+-SOURCES = $(stage1_exec_SOURCES)
+-
+ srcdir = @srcdir@
+ top_srcdir = @top_srcdir@
+ VPATH = @srcdir@
+@@ -67,13 +65,13 @@
+ *) f=$$p;; \
+ esac;
+ am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+-am__installdirs = "$(DESTDIR)$(pkglibdir)"
+-nodist_pkglibDATA_INSTALL = $(INSTALL_DATA)
+-DATA = $(nodist_pkglib_DATA)
++am__installdirs = "$(DESTDIR)$(pkgdatadir)"
++nodist_pkgdataDATA_INSTALL = $(INSTALL_DATA)
++DATA = $(nodist_pkgdata_DATA)
+ ETAGS = etags
+ CTAGS = ctags
+ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+-pkglibdir = $(libdir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
++pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
+ ACLOCAL = @ACLOCAL@
+ AMDEP_FALSE = @AMDEP_FALSE@
+ AMDEP_TRUE = @AMDEP_TRUE@
+@@ -102,6 +100,8 @@
+ EGREP = @EGREP@
+ EXEEXT = @EXEEXT@
+ FSYS_CFLAGS = @FSYS_CFLAGS@
++GRAPHICS_SUPPORT_FALSE = @GRAPHICS_SUPPORT_FALSE@
++GRAPHICS_SUPPORT_TRUE = @GRAPHICS_SUPPORT_TRUE@
+ GRUB_CFLAGS = @GRUB_CFLAGS@
+ GRUB_LIBS = @GRUB_LIBS@
+ HERCULES_SUPPORT_FALSE = @HERCULES_SUPPORT_FALSE@
+@@ -172,6 +172,7 @@
+ infodir = @infodir@
+ install_sh = @install_sh@
+ libdir = @libdir@
++datadir = @datadir@
+ libexecdir = @libexecdir@
+ localstatedir = @localstatedir@
+ mandir = @mandir@
+@@ -183,8 +184,8 @@
+ sharedstatedir = @sharedstatedir@
+ sysconfdir = @sysconfdir@
+ target_alias = @target_alias@
+-nodist_pkglib_DATA = stage1
+-CLEANFILES = $(nodist_pkglib_DATA)
++nodist_pkgdata_DATA = stage1
++CLEANFILES = $(nodist_pkgdata_DATA)
+
+ # We can't use builtins or standard includes.
+ AM_CCASFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
+@@ -242,22 +243,22 @@
+ .S.obj:
+ $(CCASCOMPILE) -c `$(CYGPATH_W) '$<'`
+ uninstall-info-am:
+-install-nodist_pkglibDATA: $(nodist_pkglib_DATA)
++install-nodist_pkgdataDATA: $(nodist_pkgdata_DATA)
+ @$(NORMAL_INSTALL)
+- test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+- @list='$(nodist_pkglib_DATA)'; for p in $$list; do \
++ test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
++ @list='$(nodist_pkgdata_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+- echo " $(nodist_pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+- $(nodist_pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
++ echo " $(nodist_pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
++ $(nodist_pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+
+-uninstall-nodist_pkglibDATA:
++uninstall-nodist_pkgdataDATA:
+ @$(NORMAL_UNINSTALL)
+- @list='$(nodist_pkglib_DATA)'; for p in $$list; do \
++ @list='$(nodist_pkgdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+- echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+- rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
++ echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
++ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
+ done
+
+ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+@@ -339,7 +340,7 @@
+ check: check-am
+ all-am: Makefile $(PROGRAMS) $(DATA)
+ installdirs:
+- for dir in "$(DESTDIR)$(pkglibdir)"; do \
++ for dir in "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+ install: install-am
+@@ -388,7 +389,7 @@
+
+ install-data-am:
+
+-install-exec-am: install-nodist_pkglibDATA
++install-exec-am: install-nodist_pkgdataDATA
+
+ install-info: install-info-am
+
+@@ -412,19 +413,19 @@
+
+ ps-am:
+
+-uninstall-am: uninstall-info-am uninstall-nodist_pkglibDATA
++uninstall-am: uninstall-info-am uninstall-nodist_pkgdataDATA
+
+ .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-noinstPROGRAMS ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+- install-info-am install-man install-nodist_pkglibDATA \
++ install-info-am install-man install-nodist_pkgdataDATA \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-info-am \
+- uninstall-nodist_pkglibDATA
++ uninstall-nodist_pkgdataDATA
+
+ .exec:
+ $(OBJCOPY) -O binary $< $@
+--- grub-0.97/util/grub-install.in.datadir 2005-12-14 11:00:21.000000000 -0500
++++ grub-0.97/util/grub-install.in 2005-12-14 11:00:21.000000000 -0500
+@@ -21,13 +21,13 @@
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+ sbindir=@sbindir@
+-libdir=@libdir@
++datadir=@datadir@
+ PACKAGE=@PACKAGE@
+ VERSION=@VERSION@
+ host_cpu=@host_cpu@
+ host_os=@host_os@
+ host_vendor=@host_vendor@
+-pkglibdir=${libdir}/${PACKAGE}/${host_cpu}-${host_vendor}
++pkgdatadir=${datadir}/${PACKAGE}/${host_cpu}-${host_vendor}
+
+ grub_shell=${sbindir}/grub
+ mdadm=${sbindir}/mdadm
+@@ -388,17 +388,17 @@
+ exit 1
+ fi
+
+-if test -f "$pkglibdir/stage1"; then
++if test -f "$pkgdatadir/stage1"; then
+ :
+ else
+- echo "${pkglibdir}/stage1: Not found." 1>&2
++ echo "${pkgdatadir}/stage1: Not found." 1>&2
+ exit 1
+ fi
+
+-if test -f "$pkglibdir/stage2"; then
++if test -f "$pkgdatadir/stage2"; then
+ :
+ else
+- echo "${pkglibdir}/stage2: Not found." 1>&2
++ echo "${pkgdatadir}/stage2: Not found." 1>&2
+ exit 1
+ fi
+
+--- grub-0.97/stage2/Makefile.am.datadir 2005-12-14 11:03:54.000000000 -0500
++++ grub-0.97/stage2/Makefile.am 2005-12-14 11:05:04.000000000 -0500
+@@ -27,12 +27,12 @@
+ -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1
+
+ # Stage 2 and Stage 1.5's.
+-pkglibdir = $(libdir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
++pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
+
+ EXTRA_PROGRAMS = nbloader.exec pxeloader.exec diskless.exec
+
+ if DISKLESS_SUPPORT
+-pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
++pkgdata_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
+ ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+ reiserfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5 \
+ nbgrub pxegrub
+@@ -43,7 +43,7 @@
+ reiserfs_stage1_5.exec ufs2_stage1_5.exec vstafs_stage1_5.exec \
+ xfs_stage1_5.exec nbloader.exec pxeloader.exec diskless.exec
+ else
+-pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
++pkgdata_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
+ ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+ reiserfs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5
+ noinst_DATA = pre_stage2 start start_eltorito
+@@ -112,7 +112,7 @@
+ BUILT_SOURCES = stage2_size.h
+ endif
+
+-CLEANFILES = $(pkglib_DATA) $(noinst_DATA) $(BUILT_SOURCES)
++CLEANFILES = $(pkgdata_DATA) $(noinst_DATA) $(BUILT_SOURCES)
+
+ stage2_size.h: pre_stage2
+ -rm -f stage2_size.h
diff --git a/src/patches/grub-0.97-dmraid-partition-names.patch b/src/patches/grub-0.97-dmraid-partition-names.patch
new file mode 100644
index 0000000..9390b29
--- /dev/null
+++ b/src/patches/grub-0.97-dmraid-partition-names.patch
@@ -0,0 +1,10 @@
+--- grub-0.97/lib/device.c.dmraid-partition-names 2006-02-13 18:53:59.000000000 -0500
++++ grub-0.97/lib/device.c 2006-02-13 18:56:04.000000000 -0500
+@@ -1106,6 +1106,7 @@
+ /* Compaq smart and others */
+ (strncmp(dev, "/dev/ida/", 9) == 0 ||
+ strncmp(dev, "/dev/ataraid/", 13) == 0 ||
++ strncmp(dev, "/dev/mapper/", 12) == 0 ||
+ strncmp(dev, "/dev/cciss/", 11) == 0 ||
+ strncmp(dev, "/dev/rd/", 8) == 0) ? "p" : "",
+ ((partition >> 16) & 0xFF) + 1);
diff --git a/src/patches/grub-0.97-dmraid-recheck-bad.patch b/src/patches/grub-0.97-dmraid-recheck-bad.patch
new file mode 100644
index 0000000..49b33ae
--- /dev/null
+++ b/src/patches/grub-0.97-dmraid-recheck-bad.patch
@@ -0,0 +1,17 @@
+--- grub-0.97/util/grub-install.in.dmraid-recheck-bad 2006-01-13 17:04:26.000000000 -0500
++++ grub-0.97/util/grub-install.in 2006-01-13 17:05:00.000000000 -0500
+@@ -415,6 +415,14 @@
+ grubdir=${bootdir}/grub
+ device_map=${grubdir}/device.map
+
++if [ "$recheck" == "yes" ]; then
++ if grep 'mapper' ${device_map} >/dev/null; then
++ echo 'grub-install does not support reprobing of device.map when' 1>&2
++ echo 'using a device-mapper based boot device.' 1>&2
++ exit 1
++ fi
++fi
++
+ # if they just want the images copied, copy the images and then exit
+ if test $justcopy = yes; then
+ copy_images
diff --git a/src/patches/grub-0.97-dmraid.patch b/src/patches/grub-0.97-dmraid.patch
new file mode 100644
index 0000000..5aad8c4
--- /dev/null
+++ b/src/patches/grub-0.97-dmraid.patch
@@ -0,0 +1,92 @@
+--- grub-0.97/util/grub-install.in.dmraid 2006-01-13 16:40:24.000000000 -0500
++++ grub-0.97/util/grub-install.in 2006-01-13 16:40:37.000000000 -0500
+@@ -101,17 +101,24 @@
+ # Break the device name into the disk part and the partition part.
+ case "$host_os" in
+ linux*)
+- tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
++ tmp_disk=`echo "$1" | grep -v '/mapper/control$' |
++ grep -v '/mapper/[[:alnum:]]\+-[[:alnum:]]\+$' | uniq |
++ sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
+ -e 's%\(d[0-9]*\)p[0-9]*$%\1%' \
+ -e 's%\(fd[0-9]*\)$%\1%' \
+ -e 's%/part[0-9]*$%/disc%' \
+- -e 's%\(c[0-7]d[0-9]*\).*$%\1%'`
+- tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \
++ -e 's%\(c[0-7]d[0-9]*\).*$%\1%' \
++ -e 's%\(/mapper/[[:alpha:]]\+_[[:alpha:]]\+\)[[:digit:]]\+$%\1%'`
++ tmp_part=`echo "$1" | grep -v '/mapper/control$' |
++ grep -v '/mapper/[[:alnum:]]\+-[[:alnum:]]\+$' | uniq |
++ sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \
+ -e 's%.*d[0-9]*p%%' \
+ -e 's%.*/fd[0-9]*$%%' \
+ -e 's%.*/floppy/[0-9]*$%%' \
+ -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
+- -e 's%.*c[0-7]d[0-9]*p%%'`
++ -e 's%.*c[0-7]d[0-9]*p%%' \
++ -e 's%.*/mapper/[[:alpha:]]\+_[[:alpha:]]\+\([[:digit:]]\+\)$%\1%' |
++ grep -v '.*/mapper/.*'`
+ ;;
+ gnu*)
+ tmp_disk=`echo "$1" | sed 's%\([sh]d[0-9]*\).*%\1%'`
+@@ -253,6 +260,43 @@
+ return 0
+ }
+
++# Usage: stat_device file
++# Find major:minor of a device node.
++stat_device() {
++ majmin=`stat -c "%t:%T" "$1" 2>/dev/null`
++ if test -z "$majmin"; then
++ echo "Could not find device for $1" 2>&1
++ exit 1
++ fi
++
++ echo "$majmin"
++}
++
++# Usage: find_mapper_device file
++# Find a file in /dev/mapper with the same major:minor as the specified node.
++find_mapper_device() {
++ if [ -b "$1" ]; then
++ dev="$1"
++ else
++ mntpnt=`echo "$1" | sed 's,/,\\\\/,g'`
++ dev=`awk '($2 ~ /'$mntpnt'/) { print $1 }' /etc/mtab`
++ fi
++ if test -z "$dev"; then
++ echo "Could not find device for $1" 2>&1
++ exit 1
++ fi
++
++ majmin=`stat_device $dev`
++ for x in /dev/mapper/* ; do
++ devmajmin=`stat_device "$x"`
++ if [ "$majmin" == "$devmajmin" ]; then
++ echo "$x"
++ return 0
++ fi
++ done
++ return 1
++}
++
+ # Usage: find_device file
+ # Find block device on which the file resides.
+ find_device () {
+@@ -265,9 +309,14 @@
+ exit 1
+ fi
+
+- tmp_fname=`resolve_symlink $tmp_fname`
++ ret_fname=`resolve_symlink $tmp_fname`
++ tmp_fname=`find_mapper_device $ret_fname`
++ if test -n "$tmp_fname"; then
++ ret_fname="$tmp_fname"
++ fi
+
+- echo "$tmp_fname"
++ echo "$ret_fname"
++ return 0
+ }
+
+ copy_images() {
diff --git a/src/patches/grub-0.97-install.in.patch b/src/patches/grub-0.97-install.in.patch
new file mode 100644
index 0000000..a9f2aef
--- /dev/null
+++ b/src/patches/grub-0.97-install.in.patch
@@ -0,0 +1,34 @@
+--- grub-0.97/util/grub-install.in.install 2005-12-12 18:15:45.000000000 -0500
++++ grub-0.97/util/grub-install.in 2005-12-12 18:18:11.000000000 -0500
+@@ -324,6 +324,15 @@
+ test -d "$bootdir" || mkdir "$bootdir" || exit 1
+ test -d "$grubdir" || mkdir "$grubdir" || exit 1
+
++# Copy the GRUB images to the GRUB directory.
++for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
++ rm -f $file || exit 1
++done
++for file in \
++ ${pkgdatadir}/stage1 ${pkgdatadir}/stage2 ${pkgdatadir}/*stage1_5; do
++ cp -f $file ${grubdir} || exit 1
++done
++
+ # If --recheck is specified, remove the device map, if present.
+ if test $recheck = yes; then
+ rm -f $device_map
+@@ -406,15 +415,6 @@
+ exit 1
+ fi
+
+-# Copy the GRUB images to the GRUB directory.
+-for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
+- rm -f $file || exit 1
+-done
+-for file in \
+- ${pkglibdir}/stage1 ${pkglibdir}/stage2 ${pkglibdir}/*stage1_5; do
+- cp -f $file ${grubdir} || exit 1
+-done
+-
+ # Make a default file.
+ ${grub_set_default} --root-directory=${rootdir} default
+
diff --git a/src/patches/grub-0.97-mactel-kbd.patch b/src/patches/grub-0.97-mactel-kbd.patch
new file mode 100644
index 0000000..f1de19f
--- /dev/null
+++ b/src/patches/grub-0.97-mactel-kbd.patch
@@ -0,0 +1,100 @@
+--- grub-0.97/stage2/asm.S.mactel-kbd 2006-06-12 17:00:10.000000000 -0400
++++ grub-0.97/stage2/asm.S 2006-06-12 17:03:38.000000000 -0400
+@@ -1651,7 +1651,30 @@
+ jnz 3f
+ ret
+
+-3: /* use keyboard controller */
++3: /*
++ * try to switch gateA20 using PORT92, the "Fast A20 and Init"
++ * register
++ */
++ mov $0x92, %dx
++ inb %dx, %al
++ /* skip the port92 code if it's unimplemented (read returns 0xff) */
++ cmpb $0xff, %al
++ jz 6f
++
++ /* set or clear bit1, the ALT_A20_GATE bit */
++ movb 4(%esp), %ah
++ testb %ah, %ah
++ jz 4f
++ orb $2, %al
++ jmp 5f
++4: and $0xfd, %al
++
++ /* clear the INIT_NOW bit; don't accidently reset the machine */
++5: and $0xfe, %al
++ outb %al, %dx
++
++
++6: /* use keyboard controller */
+ pushl %eax
+
+ call gloop1
+@@ -1661,9 +1684,12 @@
+
+ gloopint1:
+ inb $K_STATUS
++ cmpb $0xff, %al
++ jz gloopint1_done
+ andb $K_IBUF_FUL, %al
+ jnz gloopint1
+
++gloopint1_done:
+ movb $KB_OUTPUT_MASK, %al
+ cmpb $0, 0x8(%esp)
+ jz gdoit
+@@ -1684,6 +1710,8 @@
+
+ gloop1:
+ inb $K_STATUS
++ cmpb $0xff, %al
++ jz gloop2ret
+ andb $K_IBUF_FUL, %al
+ jnz gloop1
+
+@@ -1994,8 +2022,25 @@
+ call EXT_C(prot_to_real)
+ .code16
+
++.again:
++ mov $0x11, %ah /* poll kbd */
+ int $0x16
+
++ jz .again
++#if 0
++/* XXX handle serial here? -- pj */
++ jnz .kbd
++#endif
++.kbd:
++ mov $0x10, %ah
++ int $0x16
++ cmp $0xe0, %al
++ jnz .not_ext
++ xor %al, %al
++.not_ext:
++ and %al, %al
++ jz .func_key
++.func_key:
+ movw %ax, %dx /* real_to_prot uses %eax */
+ call translate_keycode
+ call remap_ascii_char
+@@ -2003,7 +2048,7 @@
+ DATA32 call EXT_C(real_to_prot)
+ .code32
+
+- movw %dx, %ax
++ mov %dx, %ax
+
+ pop %ebp
+ ret
+@@ -2029,7 +2074,7 @@
+ call EXT_C(prot_to_real) /* enter real mode */
+ .code16
+
+- movb $0x1, %ah
++ movb $0x11, %ah
+ int $0x16
+
+ DATA32 jz notpending
diff --git a/src/patches/grub-0.97-mdadm-path.patch b/src/patches/grub-0.97-mdadm-path.patch
new file mode 100644
index 0000000..fff301c
--- /dev/null
+++ b/src/patches/grub-0.97-mdadm-path.patch
@@ -0,0 +1,27 @@
+--- grub-0.97/util/grub-install.in.mdadm-path 2005-12-12 18:42:23.000000000 -0500
++++ grub-0.97/util/grub-install.in 2005-12-12 18:44:15.000000000 -0500
+@@ -30,5 +30,6 @@
+ pkglibdir=${libdir}/${PACKAGE}/${host_cpu}-${host_vendor}
+
+ grub_shell=${sbindir}/grub
++mdadm=${sbindir}/mdadm
+ log_file=/tmp/grub-install.log.$$
+ img_file=/tmp/grub-install.img.$$
+@@ -217,7 +218,7 @@
+ is_raid1_device () {
+ case "$host_os" in
+ linux*)
+- level=`mdadm --query --detail $1 2>/dev/null | \
++ level=`$mdadm --query --detail $1 2>/dev/null | \
+ awk '/Raid Level :/ {print $4}'`
+ if [ "$level" = "raid1" ]; then
+ return 0
+@@ -236,7 +237,7 @@
+ linux*)
+ if is_raid1_device $source_device ; then
+ list=""
+- for device in `mdadm --query --detail "${source_device}" | \
++ for device in `$mdadm --query --detail "${source_device}" | \
+ awk '/\/dev\/[^(md)]/ {print $7}'` ; do
+ list="$list $device"
+ done
diff --git a/src/patches/grub-0.97-mpath.patch b/src/patches/grub-0.97-mpath.patch
new file mode 100644
index 0000000..4b7edf3
--- /dev/null
+++ b/src/patches/grub-0.97-mpath.patch
@@ -0,0 +1,18 @@
+--- grub-0.97/util/grub-install.in.mpath 2006-08-02 17:21:53.000000000 -0400
++++ grub-0.97/util/grub-install.in 2006-08-02 17:23:23.000000000 -0400
+@@ -107,6 +107,7 @@
+ -e 's%\(fd[0-9]*\)$%\1%' \
+ -e 's%/part[0-9]*$%/disc%' \
+ -e 's%\(c[0-7]d[0-9]*\).*$%\1%' \
++ -e 's%\(/mapper/[[:alpha:]]\+[[:digit:]]\+\)p[[:digit:]]\+$%\1%' \
+ -e 's%\(/mapper/[[:alpha:]]\+_[[:alpha:]]\+\)[[:digit:]]\+$%\1%'`
+ tmp_part=`echo "$1" | grep -v '/mapper/control$' |
+ grep -v '/mapper/[[:alnum:]]\+-[[:alnum:]]\+$' | uniq |
+@@ -116,6 +117,7 @@
+ -e 's%.*/floppy/[0-9]*$%%' \
+ -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
+ -e 's%.*c[0-7]d[0-9]*p%%' \
++ -e 's%.*/mapper/[[:alpha:]]\+[[:digit:]]\+p\([[:digit:]]\+\)$%\1%' \
+ -e 's%.*/mapper/[[:alpha:]]\+_[[:alpha:]]\+\([[:digit:]]\+\)$%\1%' |
+ grep -v '.*/mapper/.*'`
+ ;;
diff --git a/src/patches/grub-0.97-nx-multiinstall.patch b/src/patches/grub-0.97-nx-multiinstall.patch
new file mode 100644
index 0000000..f0e4ec0
--- /dev/null
+++ b/src/patches/grub-0.97-nx-multiinstall.patch
@@ -0,0 +1,60 @@
+2006-03-09 Alexandre Oliva <oliva(a)gnu.org>
+
+ * lib/builtins.c (install_blocklist_helper): Move static
+ last_lenght...
+ (install_func_context): ... here.
+ (install_func): Reset it.
+
+Index: grub-0.97/stage2/builtins.c
+===================================================================
+--- grub-0.97.orig/stage2/builtins.c 2006-03-09 10:26:41.000000000 -0300
++++ grub-0.97/stage2/builtins.c 2006-03-09 11:36:18.000000000 -0300
+@@ -1926,11 +1926,13 @@ static struct {
+ int saved_sector;
+ int installaddr;
+ int installlist;
++ int last_length;
+ char *stage2_first_buffer;
+ } install_func_context = {
+ .saved_sector = 0,
+ .installaddr = 0,
+ .installlist = 0,
++ .last_length = SECTOR_SIZE,
+ .stage2_first_buffer = NULL,
+ };
+
+@@ -1960,19 +1962,19 @@ install_blocklist_helper (int sector, in
+ int *installlist = &install_func_context.installlist;
+ char **stage2_first_buffer = &install_func_context.stage2_first_buffer;
+ /* Was the last sector full? */
+- static int last_length = SECTOR_SIZE;
++ int *last_length = &install_func_context.last_length;
+
+ if (debug)
+ printf("[%d]", sector);
+
+- if (offset != 0 || last_length != SECTOR_SIZE)
++ if (offset != 0 || *last_length != SECTOR_SIZE)
+ {
+ /* We found a non-sector-aligned data block. */
+ errnum = ERR_UNALIGNED;
+ return;
+ }
+
+- last_length = length;
++ *last_length = length;
+
+ if (*((unsigned long *) (*installlist - 4))
+ + *((unsigned short *) *installlist) != sector
+@@ -2027,7 +2029,11 @@ install_func (char *arg, int flags)
+ int is_open = 0;
+ /* If LBA is forced? */
+ int is_force_lba = 0;
++ int *last_length = &install_func_context.last_length;
+
++ /* Reset state. */
++ *last_length = SECTOR_SIZE;
++
+ *stage2_first_buffer = old_sect + SECTOR_SIZE;
+ #ifdef GRUB_UTIL
+ /* If the Stage 2 is in a partition mounted by an OS, this will store
diff --git a/src/patches/grub-0.97-nxstack.patch b/src/patches/grub-0.97-nxstack.patch
new file mode 100644
index 0000000..92742cd
--- /dev/null
+++ b/src/patches/grub-0.97-nxstack.patch
@@ -0,0 +1,615 @@
+--- grub-0.97/stage2/shared.h.nxstack 2005-12-12 18:31:41.000000000 -0500
++++ grub-0.97/stage2/shared.h 2005-12-12 18:31:42.000000000 -0500
+@@ -36,8 +36,8 @@
+
+ /* Maybe redirect memory requests through grub_scratch_mem. */
+ #ifdef GRUB_UTIL
+-extern char *grub_scratch_mem;
+-# define RAW_ADDR(x) ((x) + (int) grub_scratch_mem)
++extern void *grub_scratch_mem;
++# define RAW_ADDR(x) ((x) + (unsigned long) grub_scratch_mem)
+ # define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4)
+ #else
+ # define RAW_ADDR(x) (x)
+--- grub-0.97/stage2/builtins.c.nxstack 2005-12-12 18:31:41.000000000 -0500
++++ grub-0.97/stage2/builtins.c 2005-12-12 18:41:47.000000000 -0500
+@@ -131,62 +131,97 @@
+ }
+
+
++/* blocklist_read_helper nee disk_read_blocklist_func was a nested
++ * function, to which pointers were taken and exposed globally. Even
++ * in the GNU-C nested functions extension, they have local linkage,
++ * and aren't guaranteed to be accessable *at all* outside of their
++ * containing scope.
++ *
++ * Above and beyond all of that, the variables within blocklist_func_context
++ * are originally local variables, with local (not even static) linkage,
++ * from within blocklist_func. These were each referenced by
++ * disk_read_blocklist_func, which is only called from other functions
++ * through a globally scoped pointer.
++ *
++ * The documentation in GCC actually uses the words "all hell will break
++ * loose" to describe this scenario.
++ *
++ * Also, "start_sector" was also used uninitialized, but gcc doesn't warn
++ * about it (possibly because of the scoping madness?)
++ */
++
++static struct {
++ int start_sector;
++ int num_sectors;
++ int num_entries;
++ int last_length;
++} blocklist_func_context = {
++ .start_sector = 0,
++ .num_sectors = 0,
++ .num_entries = 0,
++ .last_length = 0
++};
++
++/* Collect contiguous blocks into one entry as many as possible,
++ and print the blocklist notation on the screen. */
++static void
++blocklist_read_helper (int sector, int offset, int length)
++{
++ int *start_sector = &blocklist_func_context.start_sector;
++ int *num_sectors = &blocklist_func_context.num_sectors;
++ int *num_entries = &blocklist_func_context.num_entries;
++ int *last_length = &blocklist_func_context.last_length;
++
++ if (*num_sectors > 0)
++ {
++ if (*start_sector + *num_sectors == sector
++ && offset == 0 && *last_length == SECTOR_SIZE)
++ {
++ *num_sectors++;
++ *last_length = length;
++ return;
++ }
++ else
++ {
++ if (*last_length == SECTOR_SIZE)
++ grub_printf ("%s%d+%d", *num_entries ? "," : "",
++ *start_sector - part_start, *num_sectors);
++ else if (*num_sectors > 1)
++ grub_printf ("%s%d+%d,%d[0-%d]", *num_entries ? "," : "",
++ *start_sector - part_start, *num_sectors-1,
++ *start_sector + *num_sectors-1 - part_start,
++ *last_length);
++ else
++ grub_printf ("%s%d[0-%d]", *num_entries ? "," : "",
++ *start_sector - part_start, *last_length);
++ *num_entries++;
++ *num_sectors = 0;
++ }
++ }
++
++ if (offset > 0)
++ {
++ grub_printf("%s%d[%d-%d]", *num_entries ? "," : "",
++ sector-part_start, offset, offset+length);
++ *num_entries++;
++ }
++ else
++ {
++ *start_sector = sector;
++ *num_sectors = 1;
++ *last_length = length;
++ }
++}
++
+ /* blocklist */
+ static int
+ blocklist_func (char *arg, int flags)
+ {
+ char *dummy = (char *) RAW_ADDR (0x100000);
+- int start_sector;
+- int num_sectors = 0;
+- int num_entries = 0;
+- int last_length = 0;
+
+- auto void disk_read_blocklist_func (int sector, int offset, int length);
+-
+- /* Collect contiguous blocks into one entry as many as possible,
+- and print the blocklist notation on the screen. */
+- auto void disk_read_blocklist_func (int sector, int offset, int length)
+- {
+- if (num_sectors > 0)
+- {
+- if (start_sector + num_sectors == sector
+- && offset == 0 && last_length == SECTOR_SIZE)
+- {
+- num_sectors++;
+- last_length = length;
+- return;
+- }
+- else
+- {
+- if (last_length == SECTOR_SIZE)
+- grub_printf ("%s%d+%d", num_entries ? "," : "",
+- start_sector - part_start, num_sectors);
+- else if (num_sectors > 1)
+- grub_printf ("%s%d+%d,%d[0-%d]", num_entries ? "," : "",
+- start_sector - part_start, num_sectors-1,
+- start_sector + num_sectors-1 - part_start,
+- last_length);
+- else
+- grub_printf ("%s%d[0-%d]", num_entries ? "," : "",
+- start_sector - part_start, last_length);
+- num_entries++;
+- num_sectors = 0;
+- }
+- }
+-
+- if (offset > 0)
+- {
+- grub_printf("%s%d[%d-%d]", num_entries ? "," : "",
+- sector-part_start, offset, offset+length);
+- num_entries++;
+- }
+- else
+- {
+- start_sector = sector;
+- num_sectors = 1;
+- last_length = length;
+- }
+- }
++ int *start_sector = &blocklist_func_context.start_sector;
++ int *num_sectors = &blocklist_func_context.num_sectors;
++ int *num_entries = &blocklist_func_context.num_entries;
+
+ /* Open the file. */
+ if (! grub_open (arg))
+@@ -206,15 +241,15 @@
+ grub_printf (")");
+
+ /* Read in the whole file to DUMMY. */
+- disk_read_hook = disk_read_blocklist_func;
++ disk_read_hook = blocklist_read_helper;
+ if (! grub_read (dummy, -1))
+ goto fail;
+
+ /* The last entry may not be printed yet. Don't check if it is a
+ * full sector, since it doesn't matter if we read too much. */
+- if (num_sectors > 0)
+- grub_printf ("%s%d+%d", num_entries ? "," : "",
+- start_sector - part_start, num_sectors);
++ if (*num_sectors > 0)
++ grub_printf ("%s%d+%d", *num_entries ? "," : "",
++ *start_sector - part_start, *num_sectors);
+
+ grub_printf ("\n");
+
+@@ -1889,6 +1924,77 @@
+
+
+ /* install */
++static struct {
++ int saved_sector;
++ int installaddr;
++ int installlist;
++ char *stage2_first_buffer;
++} install_func_context = {
++ .saved_sector = 0,
++ .installaddr = 0,
++ .installlist = 0,
++ .stage2_first_buffer = NULL,
++};
++
++/* Save the first sector of Stage2 in STAGE2_SECT. */
++/* Formerly disk_read_savesect_func with local scope inside install_func */
++static void
++install_savesect_helper(int sector, int offset, int length)
++{
++ if (debug)
++ printf ("[%d]", sector);
++
++ /* ReiserFS has files which sometimes contain data not aligned
++ on sector boundaries. Returning an error is better than
++ silently failing. */
++ if (offset != 0 || length != SECTOR_SIZE)
++ errnum = ERR_UNALIGNED;
++
++ install_func_context.saved_sector = sector;
++}
++
++/* Write SECTOR to INSTALLLIST, and update INSTALLADDR and INSTALLSECT. */
++/* Formerly disk_read_blocklist_func with local scope inside install_func */
++static void
++install_blocklist_helper (int sector, int offset, int length)
++{
++ int *installaddr = &install_func_context.installaddr;
++ int *installlist = &install_func_context.installlist;
++ char **stage2_first_buffer = &install_func_context.stage2_first_buffer;
++ /* Was the last sector full? */
++ static int last_length = SECTOR_SIZE;
++
++ if (debug)
++ printf("[%d]", sector);
++
++ if (offset != 0 || last_length != SECTOR_SIZE)
++ {
++ /* We found a non-sector-aligned data block. */
++ errnum = ERR_UNALIGNED;
++ return;
++ }
++
++ last_length = length;
++
++ if (*((unsigned long *) (*installlist - 4))
++ + *((unsigned short *) *installlist) != sector
++ || *installlist == (int) *stage2_first_buffer + SECTOR_SIZE + 4)
++ {
++ *installlist -= 8;
++
++ if (*((unsigned long *) (*installlist - 8)))
++ errnum = ERR_WONT_FIT;
++ else
++ {
++ *((unsigned short *) (*installlist + 2)) = (*installaddr >> 4);
++ *((unsigned long *) (*installlist - 4)) = sector;
++ }
++ }
++
++ *((unsigned short *) *installlist) += 1;
++ *installaddr += 512;
++}
++
+ static int
+ install_func (char *arg, int flags)
+ {
+@@ -1896,8 +2002,12 @@
+ char *stage1_buffer = (char *) RAW_ADDR (0x100000);
+ char *stage2_buffer = stage1_buffer + SECTOR_SIZE;
+ char *old_sect = stage2_buffer + SECTOR_SIZE;
+- char *stage2_first_buffer = old_sect + SECTOR_SIZE;
+- char *stage2_second_buffer = stage2_first_buffer + SECTOR_SIZE;
++ /* stage2_first_buffer used to be defined as:
++ * char *stage2_first_buffer = old_sect + SECTOR_SIZE; */
++ char **stage2_first_buffer = &install_func_context.stage2_first_buffer;
++ /* and stage2_second_buffer was:
++ * char *stage2_second_buffer = stage2_first_buffer + SECTOR_SIZE; */
++ char *stage2_second_buffer = old_sect + SECTOR_SIZE + SECTOR_SIZE;
+ /* XXX: Probably SECTOR_SIZE is reasonable. */
+ char *config_filename = stage2_second_buffer + SECTOR_SIZE;
+ char *dummy = config_filename + SECTOR_SIZE;
+@@ -1906,10 +2016,11 @@
+ int src_drive, src_partition, src_part_start;
+ int i;
+ struct geometry dest_geom, src_geom;
+- int saved_sector;
++ int *saved_sector = &install_func_context.saved_sector;
+ int stage2_first_sector, stage2_second_sector;
+ char *ptr;
+- int installaddr, installlist;
++ int *installaddr = &install_func_context.installaddr;
++ int *installlist = &install_func_context.installlist;
+ /* Point to the location of the name of a configuration file in Stage 2. */
+ char *config_file_location;
+ /* If FILE is a Stage 1.5? */
+@@ -1918,68 +2029,14 @@
+ int is_open = 0;
+ /* If LBA is forced? */
+ int is_force_lba = 0;
+- /* Was the last sector full? */
+- int last_length = SECTOR_SIZE;
+
++ *stage2_first_buffer = old_sect + SECTOR_SIZE;
+ #ifdef GRUB_UTIL
+ /* If the Stage 2 is in a partition mounted by an OS, this will store
+ the filename under the OS. */
+ char *stage2_os_file = 0;
+ #endif /* GRUB_UTIL */
+
+- auto void disk_read_savesect_func (int sector, int offset, int length);
+- auto void disk_read_blocklist_func (int sector, int offset, int length);
+-
+- /* Save the first sector of Stage2 in STAGE2_SECT. */
+- auto void disk_read_savesect_func (int sector, int offset, int length)
+- {
+- if (debug)
+- printf ("[%d]", sector);
+-
+- /* ReiserFS has files which sometimes contain data not aligned
+- on sector boundaries. Returning an error is better than
+- silently failing. */
+- if (offset != 0 || length != SECTOR_SIZE)
+- errnum = ERR_UNALIGNED;
+-
+- saved_sector = sector;
+- }
+-
+- /* Write SECTOR to INSTALLLIST, and update INSTALLADDR and
+- INSTALLSECT. */
+- auto void disk_read_blocklist_func (int sector, int offset, int length)
+- {
+- if (debug)
+- printf("[%d]", sector);
+-
+- if (offset != 0 || last_length != SECTOR_SIZE)
+- {
+- /* We found a non-sector-aligned data block. */
+- errnum = ERR_UNALIGNED;
+- return;
+- }
+-
+- last_length = length;
+-
+- if (*((unsigned long *) (installlist - 4))
+- + *((unsigned short *) installlist) != sector
+- || installlist == (int) stage2_first_buffer + SECTOR_SIZE + 4)
+- {
+- installlist -= 8;
+-
+- if (*((unsigned long *) (installlist - 8)))
+- errnum = ERR_WONT_FIT;
+- else
+- {
+- *((unsigned short *) (installlist + 2)) = (installaddr >> 4);
+- *((unsigned long *) (installlist - 4)) = sector;
+- }
+- }
+-
+- *((unsigned short *) installlist) += 1;
+- installaddr += 512;
+- }
+-
+ /* First, check the GNU-style long option. */
+ while (1)
+ {
+@@ -2011,10 +2068,10 @@
+ addr = skip_to (0, file);
+
+ /* Get the installation address. */
+- if (! safe_parse_maxint (&addr, &installaddr))
++ if (! safe_parse_maxint (&addr, installaddr))
+ {
+ /* ADDR is not specified. */
+- installaddr = 0;
++ *installaddr = 0;
+ ptr = addr;
+ errnum = 0;
+ }
+@@ -2110,17 +2167,17 @@
+ = 0x9090;
+
+ /* Read the first sector of Stage 2. */
+- disk_read_hook = disk_read_savesect_func;
+- if (grub_read (stage2_first_buffer, SECTOR_SIZE) != SECTOR_SIZE)
++ disk_read_hook = install_savesect_helper;
++ if (grub_read (*stage2_first_buffer, SECTOR_SIZE) != SECTOR_SIZE)
+ goto fail;
+
+- stage2_first_sector = saved_sector;
++ stage2_first_sector = *saved_sector;
+
+ /* Read the second sector of Stage 2. */
+ if (grub_read (stage2_second_buffer, SECTOR_SIZE) != SECTOR_SIZE)
+ goto fail;
+
+- stage2_second_sector = saved_sector;
++ stage2_second_sector = *saved_sector;
+
+ /* Check for the version of Stage 2. */
+ if (*((short *) (stage2_second_buffer + STAGE2_VER_MAJ_OFFS))
+@@ -2136,27 +2193,27 @@
+
+ /* If INSTALLADDR is not specified explicitly in the command-line,
+ determine it by the Stage 2 id. */
+- if (! installaddr)
++ if (! *installaddr)
+ {
+ if (! is_stage1_5)
+ /* Stage 2. */
+- installaddr = 0x8000;
++ *installaddr = 0x8000;
+ else
+ /* Stage 1.5. */
+- installaddr = 0x2000;
++ *installaddr = 0x2000;
+ }
+
+ *((unsigned long *) (stage1_buffer + STAGE1_STAGE2_SECTOR))
+ = stage2_first_sector;
+ *((unsigned short *) (stage1_buffer + STAGE1_STAGE2_ADDRESS))
+- = installaddr;
++ = *installaddr;
+ *((unsigned short *) (stage1_buffer + STAGE1_STAGE2_SEGMENT))
+- = installaddr >> 4;
++ = *installaddr >> 4;
+
+- i = (int) stage2_first_buffer + SECTOR_SIZE - 4;
++ i = (int) *stage2_first_buffer + SECTOR_SIZE - 4;
+ while (*((unsigned long *) i))
+ {
+- if (i < (int) stage2_first_buffer
++ if (i < (int) *stage2_first_buffer
+ || (*((int *) (i - 4)) & 0x80000000)
+ || *((unsigned short *) i) >= 0xA00
+ || *((short *) (i + 2)) == 0)
+@@ -2170,13 +2227,13 @@
+ i -= 8;
+ }
+
+- installlist = (int) stage2_first_buffer + SECTOR_SIZE + 4;
+- installaddr += SECTOR_SIZE;
++ *installlist = (int) *stage2_first_buffer + SECTOR_SIZE + 4;
++ *installaddr += SECTOR_SIZE;
+
+ /* Read the whole of Stage2 except for the first sector. */
+ grub_seek (SECTOR_SIZE);
+
+- disk_read_hook = disk_read_blocklist_func;
++ disk_read_hook = install_blocklist_helper;
+ if (! grub_read (dummy, -1))
+ goto fail;
+
+@@ -2259,7 +2316,7 @@
+ /* Skip the first sector. */
+ grub_seek (SECTOR_SIZE);
+
+- disk_read_hook = disk_read_savesect_func;
++ disk_read_hook = install_savesect_helper;
+ if (grub_read (stage2_buffer, SECTOR_SIZE) != SECTOR_SIZE)
+ goto fail;
+
+@@ -2329,7 +2386,7 @@
+ else
+ #endif /* GRUB_UTIL */
+ {
+- if (! devwrite (saved_sector - part_start, 1, stage2_buffer))
++ if (! devwrite (*saved_sector - part_start, 1, stage2_buffer))
+ goto fail;
+ }
+ }
+@@ -2351,7 +2408,7 @@
+ goto fail;
+ }
+
+- if (fwrite (stage2_first_buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
++ if (fwrite (*stage2_first_buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
+ {
+ fclose (fp);
+ errnum = ERR_WRITE;
+@@ -2378,7 +2435,7 @@
+ goto fail;
+
+ if (! devwrite (stage2_first_sector - src_part_start, 1,
+- stage2_first_buffer))
++ *stage2_first_buffer))
+ goto fail;
+
+ if (! devwrite (stage2_second_sector - src_part_start, 1,
+--- grub-0.97/grub/asmstub.c.nxstack 2005-12-12 18:31:41.000000000 -0500
++++ grub-0.97/grub/asmstub.c 2005-12-12 18:31:42.000000000 -0500
+@@ -42,6 +42,7 @@
+ #include <sys/time.h>
+ #include <termios.h>
+ #include <signal.h>
++#include <sys/mman.h>
+
+ #ifdef __linux__
+ # include <sys/ioctl.h> /* ioctl */
+@@ -82,7 +83,7 @@
+ struct apm_info apm_bios_info;
+
+ /* Emulation requirements. */
+-char *grub_scratch_mem = 0;
++void *grub_scratch_mem = 0;
+
+ struct geometry *disks = 0;
+
+@@ -106,14 +107,62 @@
+ static unsigned int serial_speed;
+ #endif /* SIMULATE_SLOWNESS_OF_SERIAL */
+
++/* This allocates page-aligned storage of the specified size, which must be
++ * a multiple of the page size as determined by calling sysconf(_SC_PAGESIZE)
++ */
++#ifdef __linux__
++static void *
++grub_mmap_alloc(size_t len)
++{
++ int mmap_flags = MAP_ANONYMOUS|MAP_PRIVATE|MAP_EXECUTABLE;
++
++#ifdef MAP_32BIT
++ mmap_flags |= MAP_32BIT;
++#endif
++ /* Mark the simulated stack executable, as GCC uses stack trampolines
++ * to implement nested functions. */
++ return mmap(NULL, len, PROT_READ|PROT_WRITE|PROT_EXEC, mmap_flags, -1, 0);
++}
++#else /* !defined(__linux__) */
++static void *
++grub_mmap_alloc(size_t len)
++{
++ int fd = 0, offset = 0, ret = 0;
++ void *pa = MAP_FAILED;
++ char template[] = "/tmp/grub_mmap_alloc_XXXXXX";
++ errno_t e;
++
++ fd = mkstemp(template);
++ if (fd < 0)
++ return pa;
++
++ unlink(template);
++
++ ret = ftruncate(fd, len);
++ if (ret < 0)
++ return pa;
++
++ /* Mark the simulated stack executable, as GCC uses stack trampolines
++ * to implement nested functions. */
++ pa = mmap(NULL, len, PROT_READ|PROT_WRITE|PROT_EXEC,
++ MAP_PRIVATE|MAP_EXECUTABLE, fd, offset);
++
++ e = errno;
++ close(fd);
++ errno = e;
++ return pa;
++}
++#endif /* defined(__linux__) */
++
+ /* The main entry point into this mess. */
+ int
+ grub_stage2 (void)
+ {
+ /* These need to be static, because they survive our stack transitions. */
+ static int status = 0;
+- static char *realstack;
+- char *scratch, *simstack;
++ static void *realstack;
++ void *simstack_alloc_base, *simstack;
++ size_t simstack_size, page_size;
+ int i;
+
+ auto void doit (void);
+@@ -145,9 +194,35 @@
+ }
+
+ assert (grub_scratch_mem == 0);
+- scratch = malloc (0x100000 + EXTENDED_MEMSIZE + 15);
+- assert (scratch);
+- grub_scratch_mem = (char *) ((((int) scratch) >> 4) << 4);
++
++ /* Allocate enough pages for 0x100000 + EXTENDED_SIZE + 15, and
++ * make sure the memory is aligned to a multiple of the system's
++ * page size */
++ page_size = sysconf (_SC_PAGESIZE);
++ simstack_size = ( 0x100000 + EXTENDED_MEMSIZE + 15);
++ if (simstack_size % page_size)
++ {
++ /* If we're not on a page_size boundary, round up to the next one */
++ simstack_size &= ~(page_size-1);
++ simstack_size += page_size;
++ }
++
++ /* Add one for a PROT_NONE boundary page at each end. */
++ simstack_size += 2 * page_size;
++
++ simstack_alloc_base = grub_mmap_alloc(simstack_size);
++ assert (simstack_alloc_base != MAP_FAILED);
++
++ /* mark pages above and below our simstack area as innaccessable.
++ * If the implementation we're using doesn't support that, then the
++ * new protection modes are undefined. It's safe to just ignore
++ * them, though. It'd be nice if we knew that we'd get a SEGV for
++ * touching the area, but that's all. it'd be nice to have. */
++ mprotect (simstack_alloc_base, page_size, PROT_NONE);
++ mprotect ((void *)((unsigned long)simstack_alloc_base +
++ simstack_size - page_size), page_size, PROT_NONE);
++
++ grub_scratch_mem = (void *)((unsigned long)simstack_alloc_base + page_size);
+
+ /* FIXME: simulate the memory holes using mprot, if available. */
+
+@@ -220,7 +295,7 @@
+ device_map = 0;
+ free (disks);
+ disks = 0;
+- free (scratch);
++ munmap(simstack_alloc_base, simstack_size);
+ grub_scratch_mem = 0;
+
+ if (serial_device)
diff --git a/src/patches/grub-0.97-once.patch b/src/patches/grub-0.97-once.patch
new file mode 100644
index 0000000..6fb9a8d
--- /dev/null
+++ b/src/patches/grub-0.97-once.patch
@@ -0,0 +1,513 @@
+--- grub-0.97/stage2/builtins.c.bootonce 2005-12-12 18:23:12.000000000 -0500
++++ grub-0.97/stage2/builtins.c 2005-12-12 18:29:20.000000000 -0500
+@@ -3217,146 +3217,175 @@
+ };
+
+
+-/* 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)
+- unsigned long tmp_drive = saved_drive;
+- unsigned long tmp_partition = saved_partition;
+- char *default_file = (char *) DEFAULT_FILE_BUF;
+- char buf[10];
+- char sect[SECTOR_SIZE];
+- int entryno;
+- int sector_count = 0;
+- int saved_sectors[2];
+- int saved_offsets[2];
+- int saved_lengths[2];
+-
+- /* Save sector information about at most two sectors. */
+- auto void disk_read_savesect_func (int sector, int offset, int length);
+- void disk_read_savesect_func (int sector, int offset, int length)
+- {
+- if (sector_count < 2)
+- {
+- saved_sectors[sector_count] = sector;
+- saved_offsets[sector_count] = offset;
+- saved_lengths[sector_count] = length;
+- }
+- sector_count++;
+- }
+-
+- /* This command is only useful when you boot an entry from the menu
+- interface. */
+- if (! (flags & BUILTIN_SCRIPT))
++ char buffer[512];
++ int *entryno_ptr;
++
++ /* Get the geometry of the boot drive (i.e. the disk which contains
++ this stage2). */
++ if (get_diskinfo (boot_drive, &buf_geom))
+ {
+- errnum = ERR_UNRECOGNIZED;
++ errnum = ERR_NO_DISK;
+ return 1;
+ }
+
+- /* Determine a saved entry number. */
+- if (*arg)
++ /* Load the second sector of this stage2. */
++ if (! rawread (boot_drive, install_second_sector, 0, SECTOR_SIZE, buffer))
+ {
+- if (grub_memcmp (arg, "fallback", sizeof ("fallback") - 1) == 0)
+- {
+- int i;
+- int index = 0;
+-
+- for (i = 0; i < MAX_FALLBACK_ENTRIES; i++)
+- {
+- if (fallback_entries[i] < 0)
+- break;
+- if (fallback_entries[i] == current_entryno)
+- {
+- index = i + 1;
+- break;
+- }
+- }
+-
+- if (index >= MAX_FALLBACK_ENTRIES || fallback_entries[index] < 0)
+- {
+- /* This is the last. */
+- errnum = ERR_BAD_ARGUMENT;
+- return 1;
+- }
++ return 1;
++ }
+
+- entryno = fallback_entries[index];
+- }
+- else if (! safe_parse_maxint (&arg, &entryno))
+- 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;
+ }
+- else
+- entryno = current_entryno;
++
++ entryno_ptr = (int *) (buffer + STAGE2_SAVED_ENTRYNO);
+
+- /* Open the default file. */
+- saved_drive = boot_drive;
+- saved_partition = install_partition;
+- if (grub_open (default_file))
++ /* Check if the saved entry number differs from current entry number. */
++ if (*entryno_ptr != new_default)
+ {
+- int len;
++ /* Overwrite the saved entry number. */
++ *entryno_ptr = new_default;
+
+- disk_read_hook = disk_read_savesect_func;
+- len = grub_read (buf, sizeof (buf));
+- disk_read_hook = 0;
+- grub_close ();
++ /* Save the image in the disk. */
++ if (! rawwrite (boot_drive, install_second_sector, buffer))
++ return 1;
+
+- if (len != sizeof (buf))
+- {
+- /* This is too small. Do not modify the file manually, please! */
+- errnum = ERR_READ;
+- goto fail;
+- }
++ /* Clear the cache. */
++ buf_track = -1;
++ }
+
+- if (sector_count > 2)
+- {
+- /* Is this possible?! Too fragmented! */
+- errnum = ERR_FSYS_CORRUPT;
+- goto fail;
+- }
+-
+- /* Set up a string to be written. */
+- grub_memset (buf, '\n', sizeof (buf));
+- grub_sprintf (buf, "%d", entryno);
+-
+- if (saved_lengths[0] < sizeof (buf))
+- {
+- /* The file is anchored to another file and the first few bytes
+- are spanned in two sectors. Uggh... */
+- if (! rawread (current_drive, saved_sectors[0], 0, SECTOR_SIZE,
+- sect))
+- goto fail;
+- grub_memmove (sect + saved_offsets[0], buf, saved_lengths[0]);
+- if (! rawwrite (current_drive, saved_sectors[0], sect))
+- goto fail;
++ return 0;
++}
++#endif
+
+- if (! rawread (current_drive, saved_sectors[1], 0, SECTOR_SIZE,
+- sect))
+- goto fail;
+- grub_memmove (sect + saved_offsets[1],
+- buf + saved_lengths[0],
+- sizeof (buf) - saved_lengths[0]);
+- if (! rawwrite (current_drive, saved_sectors[1], sect))
+- goto fail;
+- }
++#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;
++ int old_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 <<= 8;
++ new_default |= STAGE2_ONCEONLY_ENTRY;
++ arg = skip_to (0, arg);
++ }
+ else
+- {
+- /* This is a simple case. It fits into a single sector. */
+- if (! rawread (current_drive, saved_sectors[0], 0, SECTOR_SIZE,
+- sect))
+- goto fail;
+- grub_memmove (sect + saved_offsets[0], buf, sizeof (buf));
+- if (! rawwrite (current_drive, saved_sectors[0], sect))
+- goto fail;
+- }
++ break;
++ }
+
+- /* Clear the cache. */
+- buf_track = -1;
++ 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;
+ }
+
+- fail:
+- saved_drive = tmp_drive;
+- saved_partition = tmp_partition;
+- return errnum;
++ /* 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);
++ if (new_default & STAGE2_ONCEONLY_ENTRY)
++ {
++ old_default=*entryno_ptr;
++ *entryno_ptr = new_default + (old_default & 0xFF);
++ }
++ else
++ {
++ *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;
+@@ -3368,10 +3397,14 @@
+ "savedefault",
+ savedefault_func,
+ BUILTIN_CMDLINE,
+- "savedefault [NUM | `fallback']",
+- "Save the current entry as the default boot entry if no argument is"
+- " specified. If a number is specified, this number is saved. If"
+- " `fallback' is used, next fallback entry is saved."
++#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
+ };
+
+
+@@ -4598,6 +4631,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;
+
+--- grub-0.97/stage2/shared.h.bootonce 2005-12-12 18:23:13.000000000 -0500
++++ grub-0.97/stage2/shared.h 2005-12-12 18:23:13.000000000 -0500
+@@ -200,6 +200,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
+--- grub-0.97/stage2/builtins.c.bootonce 2006-03-13 16:55:11.000000000 -0500
++++ grub-0.97/stage2/builtins.c 2006-03-13 16:56:01.000000000 -0500
+@@ -761,11 +761,25 @@
+ };
+
+
++#if !defined(SUPPORT_DISKLESS) && !defined(GRUB_UTIL)
++static int savedefault_helper(int);
++#endif
+ /* default */
+ static int
+ default_func (char *arg, int flags)
+ {
+ #ifndef SUPPORT_DISKLESS
++#ifndef GRUB_UTIL
++ /* Has a forced once-only default been specified? */
++ if ((saved_entryno & STAGE2_ONCEONLY_ENTRY) != 0)
++ {
++ int old_defaults=saved_entryno & ~STAGE2_ONCEONLY_ENTRY;
++ grub_timeout = 0;
++ default_entry = old_defaults >> 8;
++ savedefault_helper(old_defaults & 0xff);
++ return 0;
++ }
++#endif
+ if (grub_strcmp (arg, "saved") == 0)
+ {
+ default_entry = saved_entryno;
+--- grub-0.97/stage2/stage2.c.bootonce 2006-03-13 17:27:40.000000000 -0500
++++ grub-0.97/stage2/stage2.c 2006-03-13 17:29:11.000000000 -0500
+@@ -960,38 +960,8 @@
+ if (use_config_file)
+ #endif /* GRUB_UTIL */
+ {
+- char *default_file = (char *) DEFAULT_FILE_BUF;
+ int i;
+-
+- /* Get a saved default entry if possible. */
+- saved_entryno = 0;
+- *default_file = 0;
+- grub_strncat (default_file, config_file, DEFAULT_FILE_BUFLEN);
+- for (i = grub_strlen(default_file); i >= 0; i--)
+- if (default_file[i] == '/')
+- {
+- i++;
+- break;
+- }
+- default_file[i] = 0;
+- grub_strncat (default_file + i, "default", DEFAULT_FILE_BUFLEN - i);
+- if (grub_open (default_file))
+- {
+- char buf[10]; /* This is good enough. */
+- char *p = buf;
+- int len;
+-
+- len = grub_read (buf, sizeof (buf));
+- if (len > 0)
+- {
+- buf[sizeof (buf) - 1] = 0;
+- safe_parse_maxint (&p, &saved_entryno);
+- }
+
+- grub_close ();
+- }
+- errnum = ERR_NONE;
+-
+ do
+ {
+ /* STATE 0: Before any title command.
+--- grub-0.97/util/grub-install.in.bootonce 2006-03-13 17:39:35.000000000 -0500
++++ grub-0.97/util/grub-install.in 2006-03-13 17:39:50.000000000 -0500
+@@ -30,7 +30,6 @@
+ pkglibdir=${libdir}/${PACKAGE}/${host_cpu}-${host_vendor}
+
+ grub_shell=${sbindir}/grub
+-grub_set_default=${sbindir}/grub-set-default
+ log_file=/tmp/grub-install.log.$$
+ img_file=/tmp/grub-install.img.$$
+ rootdir=
+@@ -432,9 +431,6 @@
+ exit 1
+ fi
+
+-# Make a default file.
+-${grub_set_default} --root-directory=${rootdir} default
+-
+ # Make sure that GRUB reads the same images as the host OS.
+ test -n "$mkimg" && img_file=`$mkimg`
+ test -n "$mklog" && log_file=`$mklog`
+--- grub-0.97/configure.bootonce 2006-03-13 17:49:05.000000000 -0500
++++ grub-0.97/configure 2006-03-13 17:49:16.000000000 -0500
+@@ -6135,7 +6135,7 @@
+
+
+
+- ac_config_files="$ac_config_files Makefile stage1/Makefile stage2/Makefile docs/Makefile lib/Makefile util/Makefile grub/Makefile netboot/Makefile util/grub-image util/grub-install util/grub-md5-crypt util/grub-terminfo util/grub-set-default"
++ ac_config_files="$ac_config_files Makefile stage1/Makefile stage2/Makefile docs/Makefile lib/Makefile util/Makefile grub/Makefile netboot/Makefile util/grub-image util/grub-install util/grub-md5-crypt util/grub-terminfo"
+
+ cat >confcache <<\_ACEOF
+ # This file is a shell script that caches the results of configure
+@@ -6754,7 +6754,6 @@
+ "util/grub-install" ) CONFIG_FILES="$CONFIG_FILES util/grub-install" ;;
+ "util/grub-md5-crypt" ) CONFIG_FILES="$CONFIG_FILES util/grub-md5-crypt" ;;
+ "util/grub-terminfo" ) CONFIG_FILES="$CONFIG_FILES util/grub-terminfo" ;;
+- "util/grub-set-default" ) CONFIG_FILES="$CONFIG_FILES util/grub-set-default" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+--- grub-0.97/configure.ac.bootonce 2006-03-13 17:47:24.000000000 -0500
++++ grub-0.97/configure.ac 2006-03-13 17:47:37.000000000 -0500
+@@ -666,5 +666,5 @@
+ docs/Makefile lib/Makefile util/Makefile \
+ grub/Makefile netboot/Makefile util/grub-image \
+ util/grub-install util/grub-md5-crypt \
+- util/grub-terminfo util/grub-set-default])
++ util/grub-terminfo])
+ AC_OUTPUT
+--- grub-0.97/util/Makefile.am.bootonce 2006-03-13 17:48:39.000000000 -0500
++++ grub-0.97/util/Makefile.am 2006-03-13 17:48:45.000000000 -0500
+@@ -1,6 +1,5 @@
+ bin_PROGRAMS = mbchk
+-sbin_SCRIPTS = grub-install grub-md5-crypt grub-terminfo \
+- grub-set-default
++sbin_SCRIPTS = grub-install grub-md5-crypt grub-terminfo
+ noinst_SCRIPTS = grub-image mkbimage
+
+ EXTRA_DIST = mkbimage
+--- grub-0.97/util/Makefile.in.bootonce 2006-03-13 17:47:56.000000000 -0500
++++ grub-0.97/util/Makefile.in 2006-03-13 17:48:34.000000000 -0500
+@@ -43,8 +43,7 @@
+ subdir = util
+ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/grub-image.in $(srcdir)/grub-install.in \
+- $(srcdir)/grub-md5-crypt.in $(srcdir)/grub-set-default.in \
+- $(srcdir)/grub-terminfo.in
++ $(srcdir)/grub-md5-crypt.in $(srcdir)/grub-terminfo.in
+ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+ am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
+@@ -52,8 +51,7 @@
+ $(ACLOCAL_M4)
+ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+ CONFIG_HEADER = $(top_builddir)/config.h
+-CONFIG_CLEAN_FILES = grub-image grub-install grub-md5-crypt \
+- grub-terminfo grub-set-default
++CONFIG_CLEAN_FILES = grub-image grub-install grub-md5-crypt grub-terminfo
+ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)"
+ binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+ PROGRAMS = $(bin_PROGRAMS)
+@@ -183,8 +181,7 @@
+ sharedstatedir = @sharedstatedir@
+ sysconfdir = @sysconfdir@
+ target_alias = @target_alias@
+-sbin_SCRIPTS = grub-install grub-md5-crypt grub-terminfo \
+- grub-set-default
++sbin_SCRIPTS = grub-install grub-md5-crypt grub-terminfo
+
+ noinst_SCRIPTS = grub-image mkbimage
+ EXTRA_DIST = mkbimage
+@@ -234,8 +231,6 @@
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+ grub-terminfo: $(top_builddir)/config.status $(srcdir)/grub-terminfo.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+-grub-set-default: $(top_builddir)/config.status $(srcdir)/grub-set-default.in
+- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+ install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
diff --git a/src/patches/grub-0.97-prototypes.patch b/src/patches/grub-0.97-prototypes.patch
new file mode 100644
index 0000000..21d65d5
--- /dev/null
+++ b/src/patches/grub-0.97-prototypes.patch
@@ -0,0 +1,11 @@
+--- grub-0.97/acinclude.m4.prototypes 2005-12-12 19:07:24.000000000 -0500
++++ grub-0.97/acinclude.m4 2005-12-12 19:07:56.000000000 -0500
+@@ -44,6 +44,8 @@
+ [AC_MSG_CHECKING([whether ${OBJCOPY} works for absolute addresses])
+ AC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
+ [cat > conftest.c <<\EOF
++void cmain(void);
++
+ void
+ cmain (void)
+ {
diff --git a/src/patches/grub-0.97-stderr.patch b/src/patches/grub-0.97-stderr.patch
new file mode 100644
index 0000000..71d20ad
--- /dev/null
+++ b/src/patches/grub-0.97-stderr.patch
@@ -0,0 +1,102 @@
+--- grub-0.97/util/grub-install.in.stderr 2006-07-07 10:56:37.000000000 -0400
++++ grub-0.97/util/grub-install.in 2006-07-07 11:01:35.000000000 -0400
+@@ -207,7 +207,7 @@
+ while test -L $tmp_fname; do
+ tmp_new_fname=`ls -al $tmp_fname | sed -n 's%.*-> \(.*\)%\1%p'`
+ if test -z "$tmp_new_fname"; then
+- echo "Unrecognized ls output" 2>&1
++ echo "Unrecognized ls output" 1>&2
+ exit 1
+ fi
+
+@@ -264,7 +264,7 @@
+ stat_device() {
+ majmin=`stat -c "%t:%T" "$1" 2>/dev/null`
+ if test -z "$majmin"; then
+- echo "Could not find device for $1" 2>&1
++ echo "Could not find device for $1" 1>&2
+ exit 1
+ fi
+
+@@ -281,7 +281,7 @@
+ dev=`awk '($2 ~ /'$mntpnt'/) { print $1 }' /etc/mtab`
+ fi
+ if test -z "$dev"; then
+- echo "Could not find device for $1" 2>&1
++ echo "Could not find device for $1" 1>&2
+ exit 1
+ fi
+
+@@ -304,11 +304,11 @@
+ tmp_fname=`df $1/ | sed -n 's%.*\(/dev/[^ ]*\).*%\1%p'`
+
+ if test -z "$tmp_fname"; then
+- echo "Could not find device for $1" 2>&1
++ echo "Could not find device for $1" 1>&2
+ exit 1
+ fi
+
+- ret_fname=`resolve_symlink $tmp_fname`
++ ret_fname=`resolve_symlink $tmp_fname` || exit 1
+ tmp_fname=`find_mapper_device $ret_fname`
+ if test -n "$tmp_fname"; then
+ ret_fname="$tmp_fname"
+@@ -325,7 +325,7 @@
+ done
+ for file in \
+ ${pkgdatadir}/stage1 ${pkgdatadir}/stage2 ${pkgdatadir}/*stage1_5; do
+- cp -f $file ${grubdir} || exit 1
++ cp -f $file ${grubdir} 1>&2 || exit 1
+ done
+ }
+
+@@ -520,9 +520,9 @@
+ # Check for INSTALL_DEVICE.
+ case "$install_device" in
+ /dev/*)
+- install_device=`resolve_symlink "$install_device"`
++ install_device=`resolve_symlink "$install_device"` || exit 1
+ for install_drive in `find_real_devs $install_device` ; do
+- install_drive=`convert $install_drive`
++ install_drive=`convert $install_drive` || exit 1
+ if is_raid1_device $install_device; then
+ install_drive=`echo $install_drive | sed 's/,[0-9]*)/)/'`
+ fi
+@@ -550,8 +550,8 @@
+ unset install_device
+
+ # Get the root drive.
+-root_device=`find_device ${rootdir}`
+-bootdir_device=`find_device ${bootdir}`
++root_device=`find_device ${rootdir}` || exit 1
++bootdir_device=`find_device ${bootdir}` || exit 1
+
+ # Check if the boot directory is in the same device as the root directory.
+ if test "x$root_device" != "x$bootdir_device"; then
+@@ -561,7 +561,7 @@
+ fi
+
+ # Check if the root directory exists in the same device as the grub directory.
+-grubdir_device=`find_device ${grubdir}`
++grubdir_device=`find_device ${grubdir}` || exit 1
+
+ if test "x$grubdir_device" != "x$root_device"; then
+ # For now, cannot deal with this situation.
+@@ -582,7 +582,7 @@
+ fi
+
+ # Convert the root deviceto a GRUB drive.
+-root_drive=`convert "$root_device"`
++root_drive=`convert "$root_device"` || exit 1
+ if [ "x$root_drive" = x ]; then
+ exit 1
+ fi
+@@ -618,7 +618,7 @@
+
+ for install_drive in $install_drives; do
+ # Convert the root deviceto a GRUB drive.
+- root_drive=`convert "$root_device"`
++ root_drive=`convert "$root_device"` || exit 1
+ if [ "x$root_drive" = x ]; then
+ exit 1
+ fi
hooks/post-receive
--
IPFire 2.x development tree