summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeert Bevin <gbevin@gentoo.org>2002-01-29 15:58:41 +0000
committerGeert Bevin <gbevin@gentoo.org>2002-01-29 15:58:41 +0000
commite9413b609bc43850e9482ccc315466667d0db46b (patch)
tree2d8f555df524f53afde05a104d41de7d218da4fb /sys-apps/grub
parentadd some docs (diff)
downloadgentoo-2-e9413b609bc43850e9482ccc315466667d0db46b.tar.gz
gentoo-2-e9413b609bc43850e9482ccc315466667d0db46b.tar.bz2
gentoo-2-e9413b609bc43850e9482ccc315466667d0db46b.zip
grub version update to 0.91
Diffstat (limited to 'sys-apps/grub')
-rw-r--r--sys-apps/grub/files/digest-grub-0.5.96.1-r41
-rw-r--r--sys-apps/grub/files/digest-grub-0.90-r31
-rw-r--r--sys-apps/grub/files/digest-grub-0.911
-rw-r--r--sys-apps/grub/files/grub-0.5.96.1-r3-gentoo.diff15
-rw-r--r--sys-apps/grub/files/grub-0.5.96.1-r4-gentoo.diff15
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.5.96.1-dont-give-mem-to-kernel.patch30
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.5.96.1-special-raid-devices.patch17
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.90-addsyncs.patch57
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.90-append.patch111
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.90-install.in.patch34
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.90-installcopyonly.patch85
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.90-passwordprompt.patch146
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.90-symlinkmenulst.patch16
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.90-vga16-keypressclear.patch36
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.91-initrdusemem.patch107
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.91-splashimagehelp.patch28
-rw-r--r--sys-apps/grub/files/grub-0.91/grub-0.91-vga16.patch2057
-rw-r--r--sys-apps/grub/files/grub-0.91/splash.xpm.gzbin0 -> 33856 bytes
-rw-r--r--sys-apps/grub/grub-0.5.96.1-r4.ebuild32
-rw-r--r--sys-apps/grub/grub-0.90-r3.ebuild64
-rw-r--r--sys-apps/grub/grub-0.91.ebuild72
21 files changed, 2797 insertions, 128 deletions
diff --git a/sys-apps/grub/files/digest-grub-0.5.96.1-r4 b/sys-apps/grub/files/digest-grub-0.5.96.1-r4
deleted file mode 100644
index 0739167187b1..000000000000
--- a/sys-apps/grub/files/digest-grub-0.5.96.1-r4
+++ /dev/null
@@ -1 +0,0 @@
-MD5 3c078fa58deaf7ea3bdf3135b3b4e975 grub-0.5.96.1.tar.gz 708608
diff --git a/sys-apps/grub/files/digest-grub-0.90-r3 b/sys-apps/grub/files/digest-grub-0.90-r3
deleted file mode 100644
index fed5b37e14e6..000000000000
--- a/sys-apps/grub/files/digest-grub-0.90-r3
+++ /dev/null
@@ -1 +0,0 @@
-MD5 e435d871e5d06b3106342d880380605e grub-0.90.tar.gz 745472
diff --git a/sys-apps/grub/files/digest-grub-0.91 b/sys-apps/grub/files/digest-grub-0.91
new file mode 100644
index 000000000000..7c088acabb37
--- /dev/null
+++ b/sys-apps/grub/files/digest-grub-0.91
@@ -0,0 +1 @@
+MD5 83f60ed38224c2f4921d72ed56f4fa90 grub-0.91.tar.gz 868352
diff --git a/sys-apps/grub/files/grub-0.5.96.1-r3-gentoo.diff b/sys-apps/grub/files/grub-0.5.96.1-r3-gentoo.diff
deleted file mode 100644
index d6ab35101f80..000000000000
--- a/sys-apps/grub/files/grub-0.5.96.1-r3-gentoo.diff
+++ /dev/null
@@ -1,15 +0,0 @@
-diff -ur grub-0.5.96.1.orig/util/grub-install.in grub-0.5.96.1/util/grub-install.in
---- grub-0.5.96.1.orig/util/grub-install.in Mon Oct 16 14:42:36 2000
-+++ grub-0.5.96.1/util/grub-install.in Wed Aug 1 13:41:03 2001
-@@ -76,9 +76,9 @@
- # 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" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
- -e 's%/part[0-9]*$%/disc%'`
-- tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%'
-+ tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \
- -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%'`
- ;;
- gnu*)
diff --git a/sys-apps/grub/files/grub-0.5.96.1-r4-gentoo.diff b/sys-apps/grub/files/grub-0.5.96.1-r4-gentoo.diff
deleted file mode 100644
index d6ab35101f80..000000000000
--- a/sys-apps/grub/files/grub-0.5.96.1-r4-gentoo.diff
+++ /dev/null
@@ -1,15 +0,0 @@
-diff -ur grub-0.5.96.1.orig/util/grub-install.in grub-0.5.96.1/util/grub-install.in
---- grub-0.5.96.1.orig/util/grub-install.in Mon Oct 16 14:42:36 2000
-+++ grub-0.5.96.1/util/grub-install.in Wed Aug 1 13:41:03 2001
-@@ -76,9 +76,9 @@
- # 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" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
- -e 's%/part[0-9]*$%/disc%'`
-- tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%'
-+ tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \
- -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%'`
- ;;
- gnu*)
diff --git a/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-dont-give-mem-to-kernel.patch b/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-dont-give-mem-to-kernel.patch
new file mode 100644
index 000000000000..dd3a60d12835
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-dont-give-mem-to-kernel.patch
@@ -0,0 +1,30 @@
+--- grub-0.5.96.1/stage2/boot.c.pix Mon Oct 16 16:42:08 2000
++++ grub-0.5.96.1/stage2/boot.c Fri Feb 23 16:40:29 2001
+@@ -322,7 +322,18 @@
+
+ while (((int) dest) < CL_MY_END_ADDR && *src)
+ *(dest++) = *(src++);
+-
++
++/* don't add ``mem='' for 2.4 kernels :
++
++Newer machines have several regions of reserved memory outside and
++inside these regions. grub's actions are suicide on newer laptops,
++and machines like servers with lots of memory. Laptops have special
++sections of memory above 1MB which must be reserved... Ditto for
++ACPI tables. Using mem=XXX completely eliminates any information
++that the BIOS has provided to the OS.
++
++*/
++#if 0
+ /* Add a mem option automatically only if the user doesn't
+ specify it explicitly. */
+ if (! grub_strstr (arg, "mem=")
+@@ -337,6 +348,7 @@
+ dest = convert_to_ascii (dest, 'u', (extended_memory + 0x400));
+ *(dest++) = 'K';
+ }
++#endif
+
+ *dest = 0;
+ }
diff --git a/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-special-raid-devices.patch b/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-special-raid-devices.patch
new file mode 100644
index 000000000000..15176e7c19da
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-special-raid-devices.patch
@@ -0,0 +1,17 @@
+--- grub-0.5.96.1/lib/device.c.pix Mon Oct 16 16:41:54 2000
++++ grub-0.5.96.1/lib/device.c Tue Apr 3 12:01:41 2001
+@@ -616,7 +616,13 @@
+ if (strcmp (dev + strlen(dev) - 5, "/disc") == 0)
+ strcat (dev + strlen(dev) - 5, "/part");
+ }
+- sprintf (dev + strlen(dev), "%d", ((partition >> 16) & 0xFF) + 1);
++
++ sprintf (dev + strlen(dev), "%s%d",
++ /* Compaq smart and others */
++ (strncmp(dev, "/dev/ida/", 9) == 0 ||
++ strncmp(dev, "/dev/cciss/", 11) == 0 ||
++ strncmp(dev, "/dev/rd/", 8) == 0) ? "p" : "",
++ ((partition >> 16) & 0xFF) + 1);
+
+ /* Open the partition. */
+ fd = open (dev, O_RDWR);
diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-addsyncs.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-addsyncs.patch
new file mode 100644
index 000000000000..4c53344a3cbe
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.90-addsyncs.patch
@@ -0,0 +1,57 @@
+
+I just found another semi-critical bug, whose fix should really get
+into 0.91.
+
+It turns out that "grub-install" doesn't have any "sync" calls to make
+sure any filesystem caches are coherent with the raw devices they are
+on top of... so if your filesystem waits to write out any data from the
+copy command in the script to put the "stage1" and "stage2" in their
+final location, you're hosed.
+
+I found this because it just bit me on one of my systems running stock
+RedHat 7.2 with a large "stage2".
+
+The only script that is patched here is "grub-install". The others
+don't appear to need it as they either unmount things first or don't
+refer to devices.
+
+Hmm. Maybe the right fix is to make the "sync" system call when
+starting the GRUB shell with a device map that refers to any real disks
+or something like that.
+
+------------------------(start patch)-----------------------
+--- grub.orig/util/grub-install.in Mon Oct 22 16:46:07 2001
++++ grub/util/grub-install.in Sat Oct 27 13:06:33 2001
+@@ -244,6 +244,10 @@
+ # Create a safe temporary file.
+ test -x /bin/tempfile && log_file=`tempfile --prefix=grub`
+
++ # Before all invocations of the grub shell, call sync to make sure
++ # the raw device is in sync with any bufferring in filesystems.
++ sync
++
+ $grub_shell --batch --device-map=$device_map <<EOF >$log_file
+ quit
+ EOF
+@@ -318,6 +322,10 @@
+ # Create a safe temporary file.
+ test -x /bin/tempfile && log_file=`tempfile --prefix=grub`
+
++# 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 --device-map=$device_map <<EOF >$log_file
+ root $root_drive
+------------------------(end patch)-----------------------
+
+--
+ Erich Stefan Boleyn <erich@uruk.org> http://www.uruk.org/
+"Reality is truly stranger than fiction; Probably why fiction is so popular"
+
+_______________________________________________
+Bug-grub mailing list
+Bug-grub@gnu.org
+http://mail.gnu.org/mailman/listinfo/bug-grub
+
diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-append.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-append.patch
new file mode 100644
index 000000000000..99cd0285faef
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/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 (0);
++
++ 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/sys-apps/grub/files/grub-0.91/grub-0.90-install.in.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-install.in.patch
new file mode 100644
index 000000000000..c714196a4402
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.90-install.in.patch
@@ -0,0 +1,34 @@
+--- grub-0.90/util/grub-install.in~ Wed Feb 28 06:19:39 2001
++++ grub-0.90/util/grub-install.in Thu Jul 19 16:01:12 2001
+@@ -224,6 +224,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
+@@ -297,15 +306,6 @@
+ EOF
+ 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 \
+- ${pkgdatadir}/stage1 ${pkgdatadir}/stage2 ${pkgdatadir}/*stage1_5; do
+- cp -f $file ${grubdir} || exit 1
+-done
+
+ # Create a safe temporary file.
+ test -x /bin/tempfile && log_file=`tempfile --prefix=grub`
diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-installcopyonly.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-installcopyonly.patch
new file mode 100644
index 000000000000..1083ab507e71
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.90-installcopyonly.patch
@@ -0,0 +1,85 @@
+--- grub-0.90/util/grub-install.in~ Thu Jul 19 18:42:58 2001
++++ grub-0.90/util/grub-install.in Thu Jul 19 18:43:12 2001
+@@ -38,6 +38,7 @@
+ force_lba=
+ recheck=no
+ debug=no
++justcopy=no
+
+ # Usage: usage
+ # Print the usage.
+@@ -149,6 +150,17 @@
+ fi
+ }
+
++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
+@@ -166,6 +178,8 @@
+ force_lba="--force-lba" ;;
+ --recheck)
+ recheck=yes ;;
++ --just-copy)
++ justcopy=yes ;;
+ # This is an undocumented feature...
+ --debug)
+ debug=yes ;;
+@@ -179,12 +193,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
+@@ -195,6 +203,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
+ if test -f "$grub_shell"; then
+ :
+@@ -224,14 +244,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/sys-apps/grub/files/grub-0.91/grub-0.90-passwordprompt.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-passwordprompt.patch
new file mode 100644
index 000000000000..47810a9ca9b9
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.90-passwordprompt.patch
@@ -0,0 +1,146 @@
+diff -ur grub-0.90/stage2/stage2.c grub/stage2/stage2.c
+--- grub-0.90/stage2/stage2.c Thu Jul 19 01:58:59 2001
++++ grub/stage2/stage2.c Thu Jul 19 01:59:11 2001
+@@ -316,6 +316,7 @@
+ char *cur_entry = 0;
+ int disp_up = DISP_UP;
+ int disp_down = DISP_DOWN;
++ int ask_pass = 0;
+
+ /*
+ * Main loop for menu UI.
+@@ -423,8 +424,72 @@
+ grub_printf ("\n\
+ Use the %c and %c keys to select which entry is highlighted.\n",
+ disp_up, disp_down);
+-
+- if (! auth && password)
++
++ if (! auth && password && ask_pass)
++ {
++ /* Do password check here! */
++ char entered[32];
++ char *pptr = password;
++
++ /* we've asked, so don't ask again */
++ ask_pass = 0;
++
++ if (terminal & TERMINAL_DUMB)
++ grub_printf ("\n\nThe selected entry is %d ", entryno);
++ else
++ {
++ print_entries (view_y0 + 3, 12, first_entry, menu_entries);
++ /* highlight initial line */
++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno,
++ menu_entries);
++ }
++
++ /* Wipe out the previously entered password */
++ memset (entered, 0, sizeof (entered));
++ gotoxy (view_x0 + 1, view_y0 + 16);
++ get_cmdline (" Password: ", entered, 31, '*', 0);
++
++ while (! isspace (*pptr) && *pptr)
++ pptr++;
++
++ /* Make sure that PASSWORD is NUL-terminated. */
++ *pptr++ = 0;
++
++ if (! check_password (entered, password, password_type))
++ {
++ char *new_file = config_file;
++
++ while (isspace (*pptr))
++ pptr++;
++
++ /* If *PPTR is NUL, then allow the user to use
++ privileged instructions, otherwise, load
++ another configuration file. */
++ if (*pptr != 0)
++ {
++ while ((*(new_file++) = *(pptr++)) != 0)
++ ;
++
++ /* Make sure that the user will not have
++ authority in the next configuration. */
++ auth = 0;
++ return;
++ }
++ else
++ {
++ /* Now the user is superhuman. */
++ auth = 1;
++ goto restart;
++ }
++ }
++ else
++ {
++ printf (" Failed!\n Press any key to continue...");
++ getkey ();
++ goto restart;
++ }
++ }
++ else if (! auth && password)
+ {
+ printf ("\
+ Press enter to boot the selected OS or \'p\' to enter a\n\
+@@ -637,57 +702,8 @@
+ {
+ if (c == 'p')
+ {
+- /* Do password check here! */
+- char entered[32];
+- char *pptr = password;
+-
+- if (terminal & TERMINAL_DUMB)
+- grub_printf ("\r ");
+- else
+- gotoxy (view_x0 + 1, view_y1 + 21);
+-
+- /* Wipe out the previously entered password */
+- memset (entered, 0, sizeof (entered));
+- get_cmdline (" Password: ", entered, 31, '*', 0);
+-
+- while (! isspace (*pptr) && *pptr)
+- pptr++;
+-
+- /* Make sure that PASSWORD is NUL-terminated. */
+- *pptr++ = 0;
+-
+- if (! check_password (entered, password, password_type))
+- {
+- char *new_file = config_file;
+- while (isspace (*pptr))
+- pptr++;
+-
+- /* If *PPTR is NUL, then allow the user to use
+- privileged instructions, otherwise, load
+- another configuration file. */
+- if (*pptr != 0)
+- {
+- while ((*(new_file++) = *(pptr++)) != 0)
+- ;
+-
+- /* Make sure that the user will not have
+- authority in the next configuration. */
+- auth = 0;
+- return;
+- }
+- else
+- {
+- /* Now the user is superhuman. */
+- auth = 1;
+- goto restart;
+- }
+- }
+- else
+- {
+- printf ("Failed!\n Press any key to continue...");
+- getkey ();
+- goto restart;
+- }
++ ask_pass = 1;
++ goto restart;
+ }
+ }
+ else
diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-symlinkmenulst.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-symlinkmenulst.patch
new file mode 100644
index 000000000000..0d55efe181f5
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/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 /boot/grub/grub.conf ; then
++ test -e /boot/grub/menu.lst && ln -s ./menu.lst /boot/grub/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/sys-apps/grub/files/grub-0.91/grub-0.90-vga16-keypressclear.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-vga16-keypressclear.patch
new file mode 100644
index 000000000000..e1678344ba12
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.90-vga16-keypressclear.patch
@@ -0,0 +1,36 @@
+diff -ur grub/stage2/stage2.c grub-0.90/stage2/stage2.c
+--- grub/stage2/stage2.c Thu Jul 19 01:43:41 2001
++++ grub-0.90/stage2/stage2.c Thu Jul 19 01:50:23 2001
+@@ -503,19 +503,6 @@
+
+ c = translate_keycode (getkey ());
+
+- if (grub_timeout >= 0)
+- {
+- if (terminal & TERMINAL_DUMB)
+- grub_putchar ('\r');
+- else
+- gotoxy (view_x0 + 3, 22);
+- printf (" ");
+- grub_timeout = -1;
+- fallback_entry = -1;
+- if (! (terminal & TERMINAL_DUMB))
+- gotoxy (view_x1 - 6, view_x0 + 4 + entryno);
+- }
+-
+ /* We told them above (at least in SUPPORT_SERIAL) to use
+ '^' or 'v' so accept these keys. */
+ if (c == 16 || c == '^')
+@@ -792,6 +779,12 @@
+ }
+ #endif
+ }
++ if (grub_timeout >= 0)
++ {
++ grub_timeout = -1;
++ fallback_entry = -1;
++ goto restart;
++ }
+ }
+ }
+
diff --git a/sys-apps/grub/files/grub-0.91/grub-0.91-initrdusemem.patch b/sys-apps/grub/files/grub-0.91/grub-0.91-initrdusemem.patch
new file mode 100644
index 000000000000..e28d58c901da
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.91-initrdusemem.patch
@@ -0,0 +1,107 @@
+--- grub-0.91/stage2/shared.h Fri Jan 25 21:33:39 2002
++++ grub/stage2/shared.h Fri Jan 25 20:08:10 2002
+@@ -979,6 +979,9 @@
+ int grub_strlen (const char *str);
+ char *grub_strcpy (char *dest, const char *src);
+
++/* simple version of string to unsigned long; doesn't handle bases */
++unsigned long simple_strtoul(char *str_ptr, char **endp);
++
+ #ifndef GRUB_UTIL
+ typedef unsigned long grub_jmp_buf[6];
+ #else
+--- grub-0.91/stage2/char_io.c Fri Jan 25 21:33:39 2002
++++ grub/stage2/char_io.c Fri Jan 25 21:33:24 2002
+@@ -964,6 +964,34 @@
+ return 1;
+ }
+
++/* convert a string to an unsigned long. basically taken straight from
++ * the Linux kernel (lib/vsprintf.c) but made even simpler due to lack of
++ * base handling
++ * str_ptr is the start of the string,
++ * endp will point to the end of the parsed string when we're done
++ */
++unsigned long
++simple_strtoul(char *str_ptr, char **endp)
++{
++ unsigned long result = 0;
++
++ while (1)
++ {
++ unsigned int digit;
++
++ digit = *str_ptr - '0';
++ /* since digit is unsigned, it will wrap */
++ if (digit > 9)
++ break;
++ result = result * 10 + digit;
++ str_ptr++;
++ }
++
++ if (endp)
++ *endp = (char *)str_ptr;
++ return result;
++}
++
+ int
+ grub_tolower (int c)
+ {
+--- grub-0.91/stage2/boot.c Mon Nov 12 01:57:29 2001
++++ grub/stage2/boot.c Fri Jan 25 21:27:44 2002
+@@ -28,6 +28,7 @@
+ static int cur_addr;
+ entry_func entry_addr;
+ static struct mod_list mll[99];
++static unsigned long kernel_mem_end = 0;
+
+
+ /*
+@@ -308,6 +309,36 @@
+ 0,
+ (64 - setup_sects - 1) << 9);
+
++ /* we need to parse mem= from the command-line so that we can load
++ the initrd in the right place. bleah */
++ {
++ char *mem;
++
++ mem = grub_strstr (arg, "mem=");
++ if (mem)
++ {
++ /* we handle this identically to the kernel; see memparse
++ in lib/cmdline.c of the kernel source for the
++ original location of this code */
++ kernel_mem_end = simple_strtoul(mem+4, &mem);
++
++ switch(*mem)
++ {
++ case 'G':
++ case 'g':
++ kernel_mem_end <<= 10;
++ case 'M':
++ case 'm':
++ kernel_mem_end <<= 10;
++ case 'K':
++ case 'k':
++ kernel_mem_end <<= 10;
++ default:
++ break;
++ }
++ }
++ }
++
+ /* Copy command-line plus memory hack to staging area.
+ NOTE: Linux has a bug that it doesn't handle multiple spaces
+ between two options and a space after a "mem=" option isn't
+@@ -720,7 +751,9 @@
+ goto fail;
+ }
+
+- moveto = ((mbi.mem_upper + 0x400) * 0x400 - len) & 0xfffff000;
++ if (!kernel_mem_end)
++ kernel_mem_end = (mbi.mem_upper + 0x400) * 0x400;
++ moveto = (kernel_mem_end - len) & 0xfffff000;
+ if (moveto + len >= LINUX_INITRD_MAX_ADDRESS)
+ moveto = (LINUX_INITRD_MAX_ADDRESS - len) & 0xfffff000;
+
diff --git a/sys-apps/grub/files/grub-0.91/grub-0.91-splashimagehelp.patch b/sys-apps/grub/files/grub-0.91/grub-0.91-splashimagehelp.patch
new file mode 100644
index 000000000000..cc7807350493
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.91-splashimagehelp.patch
@@ -0,0 +1,28 @@
+diff -ur grub-0.91/docs/grub.texi grub/docs/grub.texi
+--- grub-0.91/docs/grub.texi Mon Jan 21 22:57:46 2002
++++ grub/docs/grub.texi Mon Jan 21 22:57:51 2002
+@@ -1891,6 +1891,7 @@
+ * rarp:: Initialize a network device via RARP
+ * serial:: Set up a serial device
+ * setkey:: Configure the key map
++* splashimage:: Use a splash image
+ * terminal:: Choose a terminal
+ * tftpserver:: Specify a TFTP server
+ * unhide:: Unhide a partition
+@@ -2260,6 +2261,16 @@
+ @end deffn
+
+
++@node splashimage
++@subsection splashimage
++
++@deffn Command splashimage file
++Select an image to use as the background image. This should be
++specified using normal GRUB device naming syntax. The format of the
++file is a gzipped xpm which is 640x480 with a 14 color palette.
++@end deffn
++
++
+ @node terminal
+ @subsection terminal
+
diff --git a/sys-apps/grub/files/grub-0.91/grub-0.91-vga16.patch b/sys-apps/grub/files/grub-0.91/grub-0.91-vga16.patch
new file mode 100644
index 000000000000..e908f921a908
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/grub-0.91-vga16.patch
@@ -0,0 +1,2057 @@
+diff -urN grub-0.91/ChangeLog grub/ChangeLog
+--- grub-0.91/ChangeLog Sat Jan 19 15:26:02 2002
++++ grub/ChangeLog Mon Jan 21 22:44:25 2002
+@@ -1877,6 +1877,18 @@
+ [!STAGE1_5] (CMDLINE_WIDTH): New macro.
+ [!STAGE1_5] (CMDLINE_MARGIN): Likewise.
+ * stage2/shared.h (TERMINAL_DUMB): Likewise.
++
++2000-08-29 Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
++
++ * configure.in: Added --disable-vga16 option, in case user does not
++ want the new VGA graphics interface.
++ * stage2/asm.S: Added some new functions, for graphics operations,
++ and renamed several functions to allow wrapping them.
++ * stage2/stage2.c: Main changes for VGA16 support.
++ * stage2/char_io.c: Modified calls of grub_putchar to putchar
++ * stage2/disk_io.c: Same as for char_io.c
++ * stage2/cmdline.c: Also, the same as for char_io.c
++ * stage2/shared.h: Definitions for externs and wrapping functions.
+
+ 2000-08-28 OKUJI Yoshinori <okuji@gnu.org>
+
+diff -urN grub-0.91/configure.in grub/configure.in
+--- grub-0.91/configure.in Tue Jan 15 05:27:59 2002
++++ grub/configure.in Mon Jan 21 22:44:25 2002
+@@ -18,6 +18,7 @@
+ AC_PREREQ(2.13)
+
+ AC_CANONICAL_HOST
++AM_PROG_LIBTOOL
+
+ case "$host_cpu" in
+ i[[3456]]86) host_cpu=i386 ;;
+@@ -610,6 +611,12 @@
+ ASFLAGS='$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)'
+ AC_SUBST(ASFLAGS)
+
++AC_ARG_ENABLE(vga16,
++ [ --disable-vga16 disable VGA graphics interface])
++
++if test x"$enable_vga16" != xno; then
++ STAGE2_CFLAGS="$STAGE2_CFLAGS -DVGA16=1"
++fi
+
+ dnl Output.
+ AC_OUTPUT([Makefile stage1/Makefile stage2/Makefile docs/Makefile \
+diff -urN grub-0.91/stage2/asm.S grub/stage2/asm.S
+--- grub-0.91/stage2/asm.S Sat Dec 29 13:05:36 2001
++++ grub/stage2/asm.S Mon Jan 21 22:44:25 2002
+@@ -1865,7 +1865,7 @@
+ * %cl = cursor ending scanline
+ */
+
+-ENTRY(nocursor)
++ENTRY(grub_nocursor)
+ push %ebp
+ push %ebx /* save EBX */
+
+@@ -1951,7 +1951,7 @@
+
+
+ /*
+- * console_set_attrib(attr) : Sets the character attributes for character at
++ * grub_set_attrib(attr) : Sets the character attributes for character at
+ * current cursor position.
+ *
+ * Bitfields for character's display attribute:
+@@ -1985,7 +1985,7 @@
+ * %cx = count to display (???, possible side-effects!!)
+ */
+
+-ENTRY(console_set_attrib)
++ENTRY(grub_set_attrib)
+ push %ebp
+ push %ebx
+
+@@ -2009,6 +2009,263 @@
+ pop %ebp
+ ret
+
++#ifdef VGA16
++VARIABLE(cursorX)
++.word 0
++VARIABLE(cursorY)
++.word 0
++VARIABLE(cursorWidth)
++.word 0
++VARIABLE(cursorHeight)
++.word 0
++VARIABLE(cursorCount)
++.word 0
++VARIABLE(cursorBuf)
++.byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
++
++/*
++ * set_int1c_handler(void)
++ */
++ENTRY(set_int1c_handler)
++ pushl %edi
++
++ /* save the original int1c handler */
++ movl $0x70, %edi
++ movw (%edi), %ax
++ movw %ax, ABS(int1c_offset)
++ movw 2(%edi), %ax
++ movw %ax, ABS(int1c_segment)
++
++ /* save the new int1c handler */
++ movw $ABS(int1c_handler), %ax
++ movw %ax, (%edi)
++ xorw %ax, %ax
++ movw %ax, 2(%edi)
++
++ popl %edi
++ ret
++
++
++/*
++ * unset_int1c_handler(void)
++ */
++ENTRY(unset_int1c_handler)
++ pushl %edi
++
++ /* check if int1c_handler is set */
++ movl $0x70, %edi
++ movw $ABS(int1c_handler), %ax
++ cmpw %ax, (%edi)
++ jne int1c_1
++ xorw %ax, %ax
++ cmpw %ax, 2(%edi)
++ jne int1c_1
++
++ /* restore the original */
++ movw ABS(int1c_offset), %ax
++ movw %ax, (%edi)
++ movw ABS(int1c_segment), %ax
++ movw %ax, 2(%edi)
++
++int1c_1:
++ popl %edi
++ ret
++
++/*
++ * blinks graphics cursor
++ */
++ .code16
++write_data:
++ movw $0, %ax
++ movw %ax, %ds
++
++ mov $0xA000, %ax /* video in es:di */
++ mov %ax, %es
++ mov $80, %ax
++ movw $ABS(cursorY), %si
++ mov %ds:(%si), %bx
++ mul %bx
++ movw $ABS(cursorX), %si
++ mov %ds:(%si), %bx
++ shr $3, %bx /* %bx /= 8 */
++ add %bx, %ax
++ mov %ax, %di
++
++ movw $ABS(cursorBuf), %si /* fontBuf in ds:si */
++
++ /* prepare for data moving */
++ mov $16, %dx /* altura da fonte */
++ mov $80, %bx /* bytes por linha */
++
++write_loop:
++ movb %ds:(%si), %al
++ xorb $0xff, %al
++ movb %al, %ds:(%si) /* invert cursorBuf */
++ movb %al, %es:(%di) /* write to video */
++ add %bx, %di
++ inc %si
++ dec %dx
++ jg write_loop
++ ret
++
++int1c_handler:
++ pusha
++ mov $0, %ax
++ mov %ax, %ds
++ mov $ABS(cursorCount), %si
++ mov %ds:(%si), %ax
++ inc %ax
++ mov %ax, %ds:(%si)
++ cmp $9, %ax
++ jne int1c_done
++
++ mov $0, %ax
++ mov %ax, %ds:(%si)
++/*
++ movw $0x3c4, %dx
++ movb $0x020f, %ax
++ outw %ax, %dx
++*/
++ call write_data
++
++int1c_done:
++ popa
++ iret
++ /* call previous int1c handler */
++ /* ljmp */
++ .byte 0xea
++int1c_offset: .word 0
++int1c_segment: .word 0
++ .code32
++
++
++ENTRY(get_font)
++ push %ebp
++ push %ebx
++ push %ecx
++ push %edx
++
++ call EXT_C(prot_to_real)
++ .code16
++
++ movw $0x1130, %ax
++ movb $6, %bh /* font 8x16 */
++ int $0x10
++ movw %bp, %dx
++ movw %es, %cx
++
++ DATA32 call EXT_C(real_to_prot)
++ .code32
++
++ xorl %eax, %eax
++ movw %cx, %ax
++ shll $4, %eax
++ movw %dx, %ax
++
++ pop %edx
++ pop %ecx
++ pop %ebx
++ pop %ebp
++ ret
++
++/*
++ * set_videomode(mode)
++ * BIOS call "INT 10H Function 0h" to set video mode
++ * Call with %ah = 0x0
++ * %al = video mode
++ */
++ENTRY(set_videomode)
++ push %ebp
++ push %ebx
++ push %ecx
++
++ movb 0x10(%esp), %cl
++
++ call EXT_C(prot_to_real)
++ .code16
++
++ xorw %bx, %bx
++ movb $0xf, %ah
++ int $0x10 /* Get Current Video mode */
++ movb %al, %ch
++ xorb %ah, %ah
++ movb %cl, %al
++ int $0x10 /* Set Video mode */
++
++ DATA32 call EXT_C(real_to_prot)
++ .code32
++
++ xorb %ah, %ah
++ movb %ch, %al
++
++ pop %ecx
++ pop %ebx
++ pop %ebp
++ ret
++
++/*
++ * set_palette(index, red, green, blue)
++ * BIOS call "INT 10H Function 10h" to set individual dac register
++ * Call with %ah = 0x10
++ * %bx = register number
++ * %ch = new value for green (0-63)
++ * %cl = new value for blue (0-63)
++ * %dh = new value for red (0-63)
++ */
++
++ENTRY(set_palette)
++ push %ebp
++ push %eax
++ push %ebx
++ push %ecx
++ push %edx
++
++ movw $0x3c8, %bx /* address write mode register */
++
++ /* wait vertical retrace */
++
++ movw $0x3da, %dx
++l1b: inb %dx, %al /* wait vertical active display */
++ test $8, %al
++ jnz l1b
++
++l2b: inb %dx, %al /* wait vertical retrace */
++ test $8, %al
++ jnz l2b
++
++ mov %bx, %dx
++ movb 0x18(%esp), %al /* index */
++ outb %al, %dx
++ inc %dx
++
++ movb 0x1c(%esp), %al /* red */
++ outb %al, %dx
++
++ movb 0x20(%esp), %al /* green */
++ outb %al, %dx
++
++ movb 0x24(%esp), %al /* blue */
++ outb %al, %dx
++
++ movw 0x18(%esp), %bx
++
++ call EXT_C(prot_to_real)
++ .code16
++
++ movb %bl, %bh
++ movw $0x1000, %ax
++ int $0x10
++
++ DATA32 call EXT_C(real_to_prot)
++ .code32
++
++ pop %edx
++ pop %ecx
++ pop %ebx
++ pop %eax
++ pop %ebp
++ ret
++#endif
+
+ /*
+ * getrtsecs()
+diff -urN grub-0.91/stage2/builtins.c grub/stage2/builtins.c
+--- grub-0.91/stage2/builtins.c Wed Jan 2 18:23:30 2002
++++ grub/stage2/builtins.c Mon Jan 21 22:44:25 2002
+@@ -133,6 +133,36 @@
+ grub_printf ("[%d,%d,%d]", sector, offset, length);
+ }
+
++#ifdef VGA16
++/* background */
++static int
++background_func(char *arg, int flags)
++{
++ if (grub_strlen(arg) == 6) {
++ int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
++ int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
++ int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
++
++ background = (r << 16) | (g << 8) | b;
++ if (vga_inited)
++ set_palette(0, r, g, b);
++ return (0);
++ }
++
++ return (1);
++}
++
++static struct builtin builtin_background =
++{
++ "background",
++ background_func,
++ BUILTIN_CMDLINE | BUILTIN_MENU,
++ "background RRGGBB",
++ "Sets the background color when in graphics mode."
++ "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
++};
++#endif /* VGA16 */
++
+
+ /* blocklist */
+ static int
+@@ -399,6 +429,40 @@
+ #endif /* SUPPORT_NETBOOT */
+
+
++#ifdef VGA16
++
++/* foreground */
++static int
++border_func(char *arg, int flags)
++{
++ if (grub_strlen(arg) == 6) {
++ int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
++ int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
++ int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
++
++ border = (r << 16) | (g << 8) | b;
++ if (vga_inited)
++ set_palette(0x11, r, g, b);
++
++ return (0);
++ }
++
++ return (1);
++}
++
++static struct builtin builtin_border =
++{
++ "border",
++ border_func,
++ BUILTIN_CMDLINE | BUILTIN_MENU,
++ "border RRGGBB",
++ "Sets the border video color when in graphics mode."
++ "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
++};
++
++#endif /* VGA16 */
++
++
+ /* cat */
+ static int
+ cat_func (char *arg, int flags)
+@@ -409,7 +473,7 @@
+ return 1;
+
+ while (grub_read (&c, 1))
+- grub_putchar (c);
++ putchar (c);
+
+ grub_close ();
+ return 0;
+@@ -963,6 +1027,44 @@
+ return 0;
+ }
+
++
++#ifdef VGA16
++/* display */
++static int
++display_func(char *arg, int flags)
++{
++ int i;
++
++ for (i = 0; i < MAX_DISPLAYS; i++) {
++ if (grub_strcmp(arg, display_entries[i].name) == 0)
++ break;
++ }
++
++ if (i >= MAX_DISPLAYS)
++ return (1);
++
++ display_idx = i;
++ if (display->End)
++ (*display->End)();
++ display = &display_entries[display_idx];
++
++ /* Restart cmain */
++ grub_longjmp (restart_env, 0);
++ /*NOTREACHED*/
++
++ return (0);
++}
++
++static struct builtin builtin_display =
++{
++ "display",
++ display_func,
++ BUILTIN_CMDLINE,
++ "display MODEL",
++ "Changes display type. Available modes are \"text\" and \"vga16\"."
++};
++#endif /* VGA16 */
++
+ static struct builtin builtin_displaymem =
+ {
+ "displaymem",
+@@ -1238,6 +1340,39 @@
+ " the devices which contain the file."
+ };
+
++#ifdef VGA16
++
++/* foreground */
++static int
++foreground_func(char *arg, int flags)
++{
++ if (grub_strlen(arg) == 6) {
++ int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
++ int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
++ int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
++
++ foreground = (r << 16) | (g << 8) | b;
++ if (vga_inited)
++ set_palette(15, r, g, b);
++
++ return (0);
++ }
++
++ return (1);
++}
++
++static struct builtin builtin_foreground =
++{
++ "foreground",
++ foreground_func,
++ BUILTIN_CMDLINE | BUILTIN_MENU,
++ "foreground RRGGBB",
++ "Sets the foreground color when in graphics mode."
++ "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
++};
++
++#endif /* VGA16 */
++
+
+ /* fstest */
+ static int
+@@ -1390,12 +1525,13 @@
+
+
+ /* help */
+-#define MAX_SHORT_DOC_LEN 39
+-#define MAX_LONG_DOC_LEN 66
+
+ static int
+ help_func (char *arg, int flags)
+ {
++ int MAX_SHORT_DOC_LEN = (view_x1 - view_x0 + 1) / 2 - 1;
++ int MAX_LONG_DOC_LEN = (view_x1 - view_x0) - 14;
++
+ if (! *arg)
+ {
+ /* Invoked with no argument. Print the list of the short docs. */
+@@ -1418,13 +1554,13 @@
+ len = MAX_SHORT_DOC_LEN - 1;
+
+ for (i = 0; i < len; i++)
+- grub_putchar ((*builtin)->short_doc[i]);
++ putchar ((*builtin)->short_doc[i]);
+
+ for (; i < MAX_SHORT_DOC_LEN; i++)
+- grub_putchar (' ');
++ putchar (' ');
+
+ if (! left)
+- grub_putchar ('\n');
++ putchar ('\n');
+
+ left = ! left;
+ }
+@@ -1474,8 +1610,8 @@
+
+ grub_printf (" ");
+ for (i = 0; i < len; i++)
+- grub_putchar (*doc++);
+- grub_putchar ('\n');
++ putchar (*doc++);
++ putchar ('\n');
+ }
+ }
+ }
+@@ -3149,6 +3285,74 @@
+ "Save the current entry as the default boot entry."
+ };
+
++#ifdef VGA16
++/*splashimage*/
++static int
++splashimage_func(char *arg, int flags)
++{
++ if (strlen(arg) > 63)
++ return (1);
++ if (flags == BUILTIN_CMDLINE) {
++ if (!grub_open(arg))
++ return (1);
++ grub_close();
++ }
++
++ if (flags == BUILTIN_CMDLINE || !splash_set) {
++ strcpy(splashimage, arg);
++ splash_set = 1;
++ }
++
++ if (flags == BUILTIN_CMDLINE && vga_inited) {
++ display->End();
++ display->Begin();
++ cls();
++/* grub_longjmp(restart_env, 0);*/
++ }
++
++ return (0);
++}
++
++static struct builtin builtin_splashimage =
++{
++ "splashimage",
++ splashimage_func,
++ BUILTIN_CMDLINE | BUILTIN_MENU,
++ "splashimage FILE",
++ "Load FILE as the background image when in graphics mode."
++};
++
++/*shade*/
++static int
++shade_func(char *arg, int flags)
++{
++ int new_shade;
++
++ if (!arg || safe_parse_maxint(&arg, &new_shade) == 0)
++ return (1);
++
++ if (shade != new_shade) {
++ shade = new_shade;
++ if (flags == BUILTIN_CMDLINE && vga_inited) {
++ display->End();
++ display->Begin();
++ cls();
++ }
++ }
++
++ return (0);
++}
++
++static struct builtin builtin_shade =
++{
++ "shade",
++ shade_func,
++ BUILTIN_CMDLINE | BUILTIN_MENU,
++ "shade INTEGER",
++ "If set to 0, disables the use of shaded text, else enables it."
++};
++#endif /* VGA16 */
++
+
+ #ifdef SUPPORT_SERIAL
+ /* serial */
+@@ -4438,16 +4642,79 @@
+ "Probe VBE information. If the mode number MODE is specified, show only"
+ " the information about only the mode."
+ };
+-
++
++#ifdef VGA16
+
++/* viewport */
++static int
++viewport_func (char *arg, int flags)
++{
++ int i;
++ int x0 = 80, y0 = 25, x1 = 0, y1 = 0;
++ int *pos[4] = { &x0, &y0, &x1, &y1 };
++ extern int viewport_set;
++
++ if (!arg)
++ return (1);
++ for (i = 0; i < 4; i++) {
++ if (!*arg)
++ return (1);
++ while (*arg && (*arg == ' ' || *arg == '\t'))
++ ++arg;
++ if (!safe_parse_maxint(&arg, pos[i]))
++ return (1);
++ while (*arg && (*arg != ' ' && *arg != '\t'))
++ ++arg;
++ }
++
++ x1 += x0;
++ y1 += y0;
++
++ /* minimum size is 60 colums and 16 rows */
++ if (x0 > x1 - 60 || y0 > y1 - 16 || x0 < 0 || y0 < 0 || x1 > 80 || y1 > 30)
++ return (1);
++
++ viewport_set = 1;
++ view_x0 = x0;
++ view_y0 = y0;
++ view_x1 = x1;
++ view_y1 = y1;
++
++ if (flags == BUILTIN_CMDLINE && vga_inited) {
++ display->End();
++ display->Begin();
++ cls();
++ }
++
++ return (0);
++}
++
++static struct builtin builtin_viewport =
++{
++ "viewport",
++ viewport_func,
++ BUILTIN_CMDLINE | BUILTIN_MENU,
++ "viewport x y width height",
++ "Changes grub internals to output text in the window defined by"
++ " four parameters. The x and y parameters are 0 based. This option"
++ " only works with the vga interface."
++};
++#endif /* VGA16 */
++
+ /* The table of builtin commands. Sorted in dictionary order. */
+ struct builtin *builtin_table[] =
+ {
++#ifdef VGA16
++ &builtin_background,
++#endif /* VGA16 */
+ &builtin_blocklist,
+ &builtin_boot,
+ #ifdef SUPPORT_NETBOOT
+ &builtin_bootp,
+ #endif /* SUPPORT_NETBOOT */
++#ifdef VGA16
++ &builtin_border,
++#endif /* VGA16 */
+ &builtin_cat,
+ &builtin_chainloader,
+ &builtin_cmp,
+@@ -4461,11 +4728,17 @@
+ #ifdef SUPPORT_NETBOOT
+ &builtin_dhcp,
+ #endif /* SUPPORT_NETBOOT */
++#ifdef VGA16
++ &builtin_display,
++#endif /* VGA16 */
+ &builtin_displayapm,
+ &builtin_displaymem,
+ &builtin_embed,
+ &builtin_fallback,
+ &builtin_find,
++#ifdef VGA16
++ &builtin_foreground,
++#endif /* VGA16 */
+ &builtin_fstest,
+ &builtin_geometry,
+ &builtin_halt,
+@@ -4508,6 +4781,10 @@
+ #endif /* SUPPORT_SERIAL */
+ &builtin_setkey,
+ &builtin_setup,
++#ifdef VGA16
++ &builtin_shade,
++ &builtin_splashimage,
++#endif /* VGA16 */
+ #if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES)
+ &builtin_terminal,
+ #endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */
+@@ -4521,5 +4798,8 @@
+ &builtin_unhide,
+ &builtin_uppermem,
+ &builtin_vbeprobe,
++#ifdef VGA16
++ &builtin_viewport,
++#endif /* VGA16 */
+ 0
+ };
+diff -urN grub-0.91/stage2/char_io.c grub/stage2/char_io.c
+--- grub-0.91/stage2/char_io.c Fri Jan 18 13:01:26 2002
++++ grub/stage2/char_io.c Mon Jan 21 22:47:43 2002
+@@ -262,8 +262,8 @@
+
+ /* XXX: These should be defined in shared.h, but I leave these here,
+ until this code is freezed. */
+-#define CMDLINE_WIDTH 78
+-#define CMDLINE_MARGIN 10
++ int CMDLINE_WIDTH = (view_x1 - view_x0) - 2;
++ int CMDLINE_MARGIN = 10;
+
+ int xpos, lpos, c, section;
+ /* The length of PROMPT. */
+@@ -313,7 +313,7 @@
+ {
+ int y = getxy () & 0xFF;
+
+- gotoxy (xpos, y);
++ gotoxy (xpos + view_x0, y);
+ }
+ # ifdef SUPPORT_SERIAL
+ else if (! (terminal & TERMINAL_DUMB) && (count > 4))
+@@ -325,7 +325,7 @@
+ int i;
+
+ for (i = 0; i < count; i++)
+- grub_putchar ('\b');
++ putchar ('\b');
+ }
+ # endif /* SUPPORT_SERIAL */
+ }
+@@ -351,7 +351,7 @@
+ {
+ int y = getxy () & 0xFF;
+
+- gotoxy (xpos, y);
++ gotoxy (xpos + view_x0, y);
+ }
+ # ifdef SUPPORT_SERIAL
+ else if (! (terminal & TERMINAL_DUMB) && (count > 4))
+@@ -365,9 +365,9 @@
+ for (i = lpos - count; i < lpos; i++)
+ {
+ if (! echo_char)
+- grub_putchar (buf[i]);
++ putchar (buf[i]);
+ else
+- grub_putchar (echo_char);
++ putchar (echo_char);
+ }
+ }
+ # endif /* SUPPORT_SERIAL */
+@@ -395,7 +395,7 @@
+ /* From the start to the end. */
+ len = CMDLINE_WIDTH;
+ pos = 0;
+- grub_putchar ('\r');
++ putchar ('\r');
+
+ /* If SECTION is the first section, print the prompt, otherwise,
+ print `<'. */
+@@ -407,7 +407,7 @@
+ }
+ else
+ {
+- grub_putchar ('<');
++ putchar ('<');
+ len--;
+ pos++;
+ }
+@@ -443,9 +443,9 @@
+ for (i = start; i < start + len && i < llen; i++)
+ {
+ if (! echo_char)
+- grub_putchar (buf[i]);
++ putchar (buf[i]);
+ else
+- grub_putchar (echo_char);
++ putchar (echo_char);
+
+ pos++;
+ }
+@@ -455,7 +455,7 @@
+ /* Fill up the rest of the line with spaces. */
+ for (; i < start + len; i++)
+ {
+- grub_putchar (' ');
++ putchar (' ');
+ pos++;
+ }
+
+@@ -464,9 +464,9 @@
+ if (pos == CMDLINE_WIDTH)
+ {
+ if (start + len < llen)
+- grub_putchar ('>');
++ putchar ('>');
+ else
+- grub_putchar (' ');
++ putchar (' ');
+
+ pos++;
+ }
+@@ -480,7 +480,7 @@
+ {
+ int y = getxy () & 0xFF;
+
+- gotoxy (xpos, y);
++ gotoxy (xpos + view_x0, y);
+ }
+ # ifdef SUPPORT_SERIAL
+ else if (! (terminal & TERMINAL_SERIAL) && (pos - xpos > 4))
+@@ -490,7 +490,7 @@
+ else
+ {
+ for (i = 0; i < pos - xpos; i++)
+- grub_putchar ('\b');
++ putchar ('\b');
+ }
+ # endif /* SUPPORT_SERIAL */
+ }
+@@ -500,7 +500,7 @@
+ void cl_init (void)
+ {
+ /* Distinguish us from other lines and error messages! */
+- grub_putchar ('\n');
++ putchar ('\n');
+
+ /* Print full line and set position here. */
+ cl_refresh (1, 0);
+@@ -631,7 +631,7 @@
+ /* There are more than one candidates, so print
+ the list. */
+
+- grub_putchar ('\n');
++ putchar ('\n');
+ /* Enable the auto fill mode temporarily. */
+ auto_fill = 1;
+ print_completions (is_filename, 0);
+@@ -773,7 +773,7 @@
+ }
+ }
+
+- grub_putchar ('\n');
++ putchar ('\n');
+
+ /* If ECHO_CHAR is NUL, remove the leading spaces. */
+ lpos = 0;
+@@ -1119,7 +1119,7 @@
+ {
+ /* Fold a line only if AUTO_FILL is true. */
+ if (auto_fill && col >= 79)
+- grub_putchar ('\n');
++ putchar ('\n');
+
+ col++;
+ }
+@@ -1142,7 +1142,7 @@
+
+ #ifndef STAGE1_5
+ void
+-gotoxy (int x, int y)
++grub_gotoxy (int x, int y)
+ {
+ if (terminal & TERMINAL_CONSOLE)
+ console_gotoxy (x, y);
+@@ -1166,7 +1166,7 @@
+ #endif /* SUPPORT_SERIAL */
+
+ int
+-getxy (void)
++grub_getxy (void)
+ {
+ int ret = 0;
+
+@@ -1271,7 +1271,7 @@
+ #endif /* SUPPORT_SERIAL */
+
+ void
+-cls (void)
++grub_cls (void)
+ {
+ if (terminal & TERMINAL_CONSOLE)
+ console_cls ();
+@@ -1292,7 +1292,7 @@
+ {
+ /* If the terminal is dumb, there is no way to clean the terminal. */
+ if (terminal & TERMINAL_DUMB)
+- grub_putchar ('\n');
++ putchar ('\n');
+ else
+ grub_printf ("\e[H\e[J");
+ }
+diff -urN grub-0.91/stage2/cmdline.c grub/stage2/cmdline.c
+--- grub-0.91/stage2/cmdline.c Wed Jan 2 18:23:30 2002
++++ grub/stage2/cmdline.c Mon Jan 21 22:44:25 2002
+@@ -125,7 +125,7 @@
+ init_page ();
+ #ifdef SUPPORT_DISKLESS
+ print_network_configuration ();
+- grub_putchar ('\n');
++ putchar ('\n');
+ #endif
+ print_cmdline_message (forever);
+
+diff -urN grub-0.91/stage2/disk_io.c grub/stage2/disk_io.c
+--- grub-0.91/stage2/disk_io.c Wed Nov 28 13:43:56 2001
++++ grub/stage2/disk_io.c Mon Jan 21 22:44:25 2002
+@@ -1267,7 +1267,7 @@
+ }
+
+ if (! is_completion)
+- grub_putchar ('\n');
++ putchar ('\n');
+
+ print_error ();
+ do_completion = 0;
+@@ -1334,7 +1334,7 @@
+ }
+
+ if (! is_completion)
+- grub_putchar ('\n');
++ putchar ('\n');
+ }
+ else
+ {
+@@ -1408,7 +1408,7 @@
+ }
+
+ if (! is_completion)
+- grub_putchar ('\n');
++ putchar ('\n');
+ }
+ else
+ errnum = ERR_BAD_FILENAME;
+diff -urN grub-0.91/stage2/shared.h grub/stage2/shared.h
+--- grub-0.91/stage2/shared.h Mon Jan 7 21:57:36 2002
++++ grub/stage2/shared.h Mon Jan 21 22:44:25 2002
+@@ -44,6 +44,12 @@
+ # define RAW_SEG(x) (x)
+ #endif
+
++#if defined(VGA16)
++#if defined(GRUB_UTIL) || defined(STAGE1_5)
++#undef VGA16
++#endif
++#endif
++
+ /*
+ * Integer sizes
+ */
+@@ -367,8 +373,10 @@
+ #define isspace grub_isspace
+ #define printf grub_printf
+ #define sprintf grub_sprintf
++#ifndef VGA16
+ #undef putchar
+ #define putchar grub_putchar
++#endif
+ #define strncat grub_strncat
+ #define strstr grub_strstr
+ #define memcmp grub_memcmp
+@@ -383,6 +391,9 @@
+ /*
+ * Below this should be ONLY defines and other constructs for C code.
+ */
++#ifdef VGA16
++#define VIDEO 0xA0000
++#endif
+
+ /* multiboot stuff */
+
+@@ -773,26 +784,26 @@
+ int currticks (void);
+
+ /* Clear the screen. */
+-void cls (void);
++void grub_cls (void);
+
+ /* The console part of cls. */
+ void console_cls (void);
+
+ #ifndef GRUB_UTIL
+ /* Turn off cursor. */
+-void nocursor (void);
++void grub_nocursor (void);
+ #endif
+
+ /* Get the current cursor position (where 0,0 is the top left hand
+ corner of the screen). Returns packed values, (RET >> 8) is x,
+ (RET & 0xff) is y. */
+-int getxy (void);
++int grub_getxy (void);
+
+ /* The console part of getxy. */
+ int console_getxy (void);
+
+ /* Set the cursor position. */
+-void gotoxy (int x, int y);
++void grub_gotoxy (int x, int y);
+
+ /* The console part of gotoxy. */
+ void console_gotoxy (int x, int y);
+@@ -822,8 +833,64 @@
+ constants defined above. */
+ void set_attrib (int attr);
+
++extern int view_x0, view_y0, view_x1, view_y1;
++#ifdef VGA16
++#define MAX_DISPLAYS 2
++
++#define cls() (display->Cls ? (*display->Cls)() : 0)
++#define gotoxy(x, y) (display->Gotoxy ? (*display->Gotoxy)(x, y) : 0)
++#define putchar(c) (display->Putchar ? (*display->Putchar)(c) : 0)
++#define console_set_attrib(a) (display->SetAttrib ? (*display->SetAttrib)(a) : 0)
++#define getxy() (display->Getxy ? (*display->Getxy)() : 0)
++#define nocursor() (display->Nocursor ? (*display->Nocursor)() : 0)
++struct display_entry {
++ char *name;
++ int (*Begin)(void);
++ void (*End)(void);
++ void (*Cls)(void);
++ void (*Gotoxy)(int x, int y);
++ void (*Putchar)(int ch);
++ void (*SetAttrib)(int attr);
++ int (*Getxy)(void);
++ void (*Nocursor)(void);
++};
++struct display_entry display_entries[MAX_DISPLAYS + 1];
++extern struct display_entry *display;
++
++extern int vga_inited, foreground, background, shade, border;
++extern int display_idx, splash_set;
++extern short cursorX, cursorY, cursorWidth, cursorHeight;
++extern char cursorBuf[16], splashimage[64];
++
++int vga16_begin(void);
++void vga16_end(void);
++void vga16_cls(void);
++void vga16_gotoxy(int x, int y);
++void vga16_putchar(int ch);
++int vga16_getxy(void);
++void vga16_nocursor(void);
++void vga16_set_attrib(int attr);
++
++int read_image();
++void set_palette(int index, int red, int green, int blue);
++void *get_font(void);
++/* return previous video mode */
++int set_videomode(int mode);
++
++int hex(int);
++void set_int1c_handler();
++void unset_int1c_handler();
++void cursor(int state);
++#else
++#define cls grub_cls
++#define gotoxy grub_gotoxy
++#define console_set_attrib grub_set_attrib
++#define getxy grub_getxy
++#define nocursor grub_nocursor
++#endif
++
+ /* The console part of set_attrib. */
+-void console_set_attrib (int attr);
++void grub_set_attrib (int attr);
+
+ /* Low-level disk I/O */
+ int get_diskinfo (int drive, struct geometry *geometry);
+diff -urN grub-0.91/stage2/stage2.c grub/stage2/stage2.c
+--- grub-0.91/stage2/stage2.c Mon Jan 7 21:56:45 2002
++++ grub/stage2/stage2.c Mon Jan 21 22:45:49 2002
+@@ -19,7 +19,12 @@
+
+ #include "shared.h"
+
++int view_x0 = 0, view_y0 = 0, view_x1 = 80, view_y1 = 25;
+ grub_jmp_buf restart_env;
++#ifdef VGA16
++int vga_disabled = 0, viewport_set = 0;
++int sx0, sy0, sx1, sy1;
++#endif
+
+ #if defined(PRESET_MENU_STRING) || defined(SUPPORT_DISKLESS)
+
+@@ -109,12 +114,12 @@
+ }
+ #endif /* SUPPORT_SERIAL */
+
+- gotoxy (77, y + 1);
++ gotoxy (view_x1 - 3, y + 1);
+
+ if (first)
+- grub_putchar (disp_up);
++ putchar (disp_up);
+ else
+- grub_putchar (' ');
++ putchar (' ');
+
+ menu_entries = get_entry (menu_entries, first, 0);
+
+@@ -122,13 +127,13 @@
+ {
+ int j = 0;
+
+- gotoxy (3, y + i);
++ gotoxy (view_x0 + 3, y + i);
+
+ while (*menu_entries)
+ {
+- if (j < 71)
++ if (j < (view_x1 - view_x0) - 9)
+ {
+- grub_putchar (*menu_entries);
++ putchar (*menu_entries);
+ j++;
+ }
+
+@@ -138,16 +143,16 @@
+ if (*(menu_entries - 1))
+ menu_entries++;
+
+- for (; j < 71; j++)
+- grub_putchar (' ');
++ for (; j < (view_x1 - view_x0) - 9; j++)
++ putchar (' ');
+ }
+
+- gotoxy (77, y + size);
++ gotoxy (view_x0 + 3, y + size);
+
+ if (*menu_entries)
+- grub_putchar (disp_down);
++ putchar (disp_down);
+ else
+- grub_putchar (' ');
++ putchar (' ');
+ }
+
+
+@@ -211,10 +216,10 @@
+ )
+ # endif
+ {
+- for (i = 0; i < 14; i++)
++ for (i = 0; i < 12; i++)
+ {
+ int j;
+- for (j = 0; j < 75; j++)
++ for (j = view_x0; j < (view_x1 - view_x0) - 5; j++)
+ {
+ gotoxy (j + 1, i + y);
+ set_attrib (normal_color);
+@@ -223,33 +228,33 @@
+ }
+ #endif
+
+- gotoxy (1, y);
++ gotoxy (view_x0 + 1, y);
+
+- grub_putchar (disp_ul);
+- for (i = 0; i < 73; i++)
+- grub_putchar (disp_horiz);
+- grub_putchar (disp_ur);
++ putchar (disp_ul);
++ for (i = view_x0; i < view_x1 - 7; i++)
++ putchar (disp_horiz);
++ putchar (disp_ur);
+
+ i = 1;
+
+ while (1)
+ {
+- gotoxy (1, y + i);
++ gotoxy (view_x0 + 1, y + i);
+
+ if (i > size)
+ break;
+
+- grub_putchar (disp_vert);
+- gotoxy (75, y + i);
+- grub_putchar (disp_vert);
++ putchar (disp_vert);
++ gotoxy (view_x1 - 5, y + i);
++ putchar (disp_vert);
+
+ i++;
+ }
+
+- grub_putchar (disp_ll);
+- for (i = 0; i < 73; i++)
+- grub_putchar (disp_horiz);
+- grub_putchar (disp_lr);
++ putchar (disp_ll);
++ for (i = view_x0; i < view_x1 - 7; i++)
++ putchar (disp_horiz);
++ putchar (disp_lr);
+ }
+
+ static void
+@@ -261,27 +266,27 @@
+ if (terminal & TERMINAL_SERIAL)
+ {
+ menu_entries = get_entry (menu_entries, entryno, 0);
+- gotoxy (2, y);
+- grub_putchar (' ');
+- for (x = 3; x < 75; x++)
++ gotoxy (view_x0 + 2, y);
++ putchar (' ');
++ for (x = view_x0 + 3; x < view_x1 - 5; x++)
+ {
+- if (*menu_entries && x < 71)
+- grub_putchar (*menu_entries++);
++ if (*menu_entries && x < view_x1 - 9)
++ putchar (*menu_entries++);
+ else
+- grub_putchar (' ');
++ putchar (' ');
+ }
+ }
+ else
+ #endif /* SUPPORT_SERIAL */
+ {
+- for (x = 2; x < 75; x++)
++ for (x = view_x0 + 2; x < view_x1 - 5; x++)
+ {
+ gotoxy (x, y);
+ set_attrib (attr);
+ }
+ }
+
+- gotoxy (74, y);
++ gotoxy (view_x1 - 6, y);
+ }
+
+ /* Set the attribute of the line Y to normal state. */
+@@ -334,7 +339,8 @@
+ invariant for TERMINAL_DUMB: first_entry == 0 */
+ if (! (terminal & TERMINAL_DUMB))
+ {
+- while (entryno > 11)
++ errnum = ERR_NONE;
++ while (entryno > 9)
+ {
+ first_entry++;
+ entryno--;
+@@ -399,7 +405,7 @@
+ #endif /* ! GRUB_UTIL */
+
+ if (! (terminal & TERMINAL_DUMB))
+- print_border (3, 12);
++ print_border (3 + view_y0, 12);
+
+ #ifdef GRUB_UTIL
+ /* In the grub shell, always use ACS_*. */
+@@ -455,10 +461,10 @@
+ grub_printf ("\n\nThe selected entry is %d ", entryno);
+ else
+ {
+- print_entries (3, 12, first_entry, menu_entries);
++ print_entries (view_y0 + 3, 12, first_entry, menu_entries);
+
+ /* highlight initial line */
+- set_line_highlight (4 + entryno, first_entry + entryno,
++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno,
+ menu_entries);
+ }
+ }
+@@ -487,9 +493,9 @@
+ entryno, grub_timeout);
+ else
+ {
+- gotoxy (3, 22);
++ gotoxy (view_x0 + 3, view_y1 - 3);
+ printf ("The highlighted entry will be booted automatically in %d seconds. ", grub_timeout);
+- gotoxy (74, 4 + entryno);
++ gotoxy (view_x0 - 6, view_y0 + 4 + entryno);
+ }
+
+ grub_timeout--;
+@@ -515,12 +521,12 @@
+ if (terminal & TERMINAL_DUMB)
+ grub_putchar ('\r');
+ else
+- gotoxy (3, 22);
++ gotoxy (view_x0 + 3, 22);
+ printf (" ");
+ grub_timeout = -1;
+ fallback_entry = -1;
+ if (! (terminal & TERMINAL_DUMB))
+- gotoxy (74, 4 + entryno);
++ gotoxy (view_x1 - 6, view_x0 + 4 + entryno);
+ }
+
+ /* We told them above (at least in SUPPORT_SERIAL) to use
+@@ -536,17 +542,17 @@
+ {
+ if (entryno > 0)
+ {
+- set_line_normal (4 + entryno, first_entry + entryno,
++ set_line_normal (view_y0 + 4 + entryno, first_entry + entryno,
+ menu_entries);
+ entryno--;
+- set_line_highlight (4 + entryno, first_entry + entryno,
++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno,
+ menu_entries);
+ }
+ else if (first_entry > 0)
+ {
+ first_entry--;
+- print_entries (3, 12, first_entry, menu_entries);
+- set_line_highlight (4, first_entry + entryno,
++ print_entries (view_y0 + 3, 12, first_entry, menu_entries);
++ set_line_highlight (view_y0 + 4, first_entry + entryno,
+ menu_entries);
+ }
+ }
+@@ -558,17 +564,17 @@
+ else
+ if (entryno < 11)
+ {
+- set_line_normal (4 + entryno, first_entry + entryno,
++ set_line_normal (view_y0 + 4 + entryno, first_entry + entryno,
+ menu_entries);
+ entryno++;
+- set_line_highlight (4 + entryno, first_entry + entryno,
++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno,
+ menu_entries);
+ }
+ else if (num_entries > 12 + first_entry)
+ {
+ first_entry++;
+- print_entries (3, 12, first_entry, menu_entries);
+- set_line_highlight (15, first_entry + entryno, menu_entries);
++ print_entries (view_y0 + 3, 12, first_entry, menu_entries);
++ set_line_highlight (view_y0 + 15, first_entry + entryno, menu_entries);
+ }
+ }
+
+@@ -582,7 +588,7 @@
+ if ((c == 'd') || (c == 'o') || (c == 'O'))
+ {
+ if (! (terminal & TERMINAL_DUMB))
+- set_line_normal (4 + entryno, first_entry + entryno,
++ set_line_normal (view_y0 + 4 + entryno, first_entry + entryno,
+ menu_entries);
+
+ /* insert after is almost exactly like insert before */
+@@ -640,8 +646,8 @@
+ }
+ else
+ {
+- print_entries (3, 12, first_entry, menu_entries);
+- set_line_highlight (4 + entryno, first_entry + entryno,
++ print_entries (view_y0 + 3, 12, first_entry, menu_entries);
++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno,
+ menu_entries);
+ }
+ }
+@@ -664,7 +670,7 @@
+ if (terminal & TERMINAL_DUMB)
+ grub_printf ("\r ");
+ else
+- gotoxy (1, 21);
++ gotoxy (view_x0 + 1, view_y1 + 21);
+
+ /* Wipe out the previously entered password */
+ memset (entered, 0, sizeof (entered));
+@@ -811,6 +817,11 @@
+ while (1)
+ {
+ cls ();
++#ifdef VGA16
++ if (display->End)
++ (*display->End)();
++ display = &display_entries[0];
++#endif
+
+ if (config_entries)
+ printf (" Booting \'%s\'\n\n",
+@@ -840,6 +851,16 @@
+ break;
+ }
+
++#ifdef VGA16
++ if (display_idx >= 0)
++ display = &display_entries[display_idx];
++ else if (!vga_disabled)
++ display = &display_entries[1];
++
++ if (!display->Begin || !(*display->Begin)())
++ display = &display_entries[0];
++#endif
++
+ show_menu = 1;
+ goto restart;
+ }
+@@ -904,6 +925,560 @@
+ return pos;
+ }
+
++#ifdef VGA16
++struct display_entry display_entries[MAX_DISPLAYS + 1] = {
++ {"text", 0, 0, grub_cls, grub_gotoxy, grub_putchar, grub_set_attrib,
++ grub_getxy, grub_nocursor},
++ {"vga16",
++ vga16_begin, vga16_end, vga16_cls, vga16_gotoxy, vga16_putchar,
++ vga16_set_attrib, vga16_getxy, vga16_nocursor},
++ {0, 0, 0, 0, 0, 0, 0, 0, 0}
++};
++struct display_entry *display;
++int display_idx = -1;
++
++/* default vga palette */
++char vga16pal[16][3] = {
++ { 0, 0, 0},
++ { 0, 0, 42},
++ { 0, 42, 0},
++ { 0, 42, 42},
++ {42, 0, 0},
++ {42, 0, 42},
++ {42, 21, 0},
++ {42, 42, 42},
++ {21, 21, 21},
++ {21, 21, 63},
++ {21, 63, 21},
++ {21, 63, 63},
++ {63, 21, 21},
++ {63, 21, 63},
++ {63, 63, 21},
++ {63, 63, 63},
++};
++
++int fontx, fonty;
++unsigned char *font8x16;
++int saved_videomode, no_scroll = 0, no_cursor = 0, shade = 1, vga_inited = 0;
++unsigned short text[80 * 30];
++int foreground = (63 << 16) | (63 << 8) | (63), background = 0, border = 0;
++int splash_set;
++char splashimage[64];
++#define VSHADOW VSHADOW1
++unsigned char VSHADOW1[38400];
++unsigned char VSHADOW2[38400];
++unsigned char VSHADOW4[38400];
++unsigned char VSHADOW8[38400];
++
++static inline void
++outb(unsigned short port, unsigned char val)
++{
++ __asm __volatile ("outb %0,%1"::"a" (val), "d" (port));
++}
++
++static void
++ModeReg(int value)
++{
++ outb(0x3ce, 5);
++ outb(0x3cf, value);
++}
++
++static void
++MapMask(int value)
++{
++ outb(0x3c4, 2);
++ outb(0x3c5, value);
++}
++
++/* set/reset register */
++static void
++SetRes(int value)
++{
++ outb(0x3ce, 0);
++ outb(0x3cf, value);
++}
++
++/* enable set/reset register */
++static void
++ESetRes(int value)
++{
++ outb(0x3ce, 1);
++ outb(0x3cf, value);
++}
++
++static void
++ReadMap(int value)
++{
++ outb(0x3ce, 4);
++ outb(0x3cf, value);
++}
++
++/* bit mask register */
++static void
++BitMask(int value)
++{
++ outb(0x3ce, 8);
++ outb(0x3cf, value);
++}
++
++void
++grub_memcpy(void *dest, const void *src, int len)
++{
++ int i;
++ register char *d = (char*)dest, *s = (char*)src;
++
++ for (i = 0; i < len; i++)
++ d[i] = s[i];
++}
++
++int
++hex(int v)
++{
++ if (v >= 'A' && v <= 'F')
++ return (v - 'A' + 10);
++ if (v >= 'a' && v <= 'f')
++ return (v - 'a' + 10);
++ return (v - '0');
++}
++
++static void
++SetXY(int col, int row)
++{
++ if (col >= view_x0 && col < view_x1) {
++ fontx = col;
++ cursorX = col << 3;
++ }
++ if (row >= view_y0 && row < view_y1) {
++ fonty = row;
++ cursorY = row << 4;
++ }
++}
++
++void
++cursor(int set)
++{
++ unsigned char *pat, *mem, *ptr, chr[16 << 2];
++ int i, ch, invert, offset;
++
++ if (set && (no_cursor || no_scroll))
++ return;
++
++ offset = cursorY * 80 + fontx;
++ ch = text[fonty * 80 + fontx] & 0xff;
++ invert = (text[fonty * 80 + fontx] & 0xff00) != 0;
++ pat = font8x16 + (ch << 4);
++
++ mem = (unsigned char*)VIDEO + offset;
++
++ if (!set) {
++ for (i = 0; i < 16; i++) {
++ unsigned char mask = pat[i];
++
++ if (!invert) {
++ chr[i ] = ((unsigned char*)VSHADOW1)[offset];
++ chr[16 + i] = ((unsigned char*)VSHADOW2)[offset];
++ chr[32 + i] = ((unsigned char*)VSHADOW4)[offset];
++ chr[48 + i] = ((unsigned char*)VSHADOW8)[offset];
++
++ if (shade) {
++ if (ch == DISP_VERT || ch == DISP_LL ||
++ ch == DISP_UR || ch == DISP_LR) {
++ unsigned char pmask = ~(pat[i] >> 1);
++
++ chr[i ] &= pmask;
++ chr[16 + i] &= pmask;
++ chr[32 + i] &= pmask;
++ chr[48 + i] &= pmask;
++ }
++ if (i > 0 && ch != DISP_VERT) {
++ unsigned char pmask = ~(pat[i - 1] >> 1);
++
++ chr[i ] &= pmask;
++ chr[16 + i] &= pmask;
++ chr[32 + i] &= pmask;
++ chr[48 + i] &= pmask;
++ if (ch == DISP_HORIZ || ch == DISP_UR || ch == DISP_LR) {
++ pmask = ~pat[i - 1];
++
++ chr[i ] &= pmask;
++ chr[16 + i] &= pmask;
++ chr[32 + i] &= pmask;
++ chr[48 + i] &= pmask;
++ }
++ }
++ }
++ chr[i ] |= mask;
++ chr[16 + i] |= mask;
++ chr[32 + i] |= mask;
++ chr[48 + i] |= mask;
++
++ offset += 80;
++ }
++ else {
++ chr[i ] = mask;
++ chr[16 + i] = mask;
++ chr[32 + i] = mask;
++ chr[48 + i] = mask;
++ }
++ }
++ }
++ else {
++ MapMask(15);
++ ptr = mem;
++ for (i = 0; i < 16; i++, ptr += 80) {
++ cursorBuf[i] = pat[i];
++ *ptr = ~pat[i];
++ }
++ return;
++ }
++
++ offset = 0;
++ for (i = 1; i < 16; i <<= 1, offset += 16) {
++ int j;
++
++ MapMask(i);
++ ptr = mem;
++ for (j = 0; j < 16; j++, ptr += 80)
++ *ptr = chr[j + offset];
++ }
++
++ MapMask(15);
++}
++
++int
++read_image(void)
++{
++ char buf[32], pal[16];
++ unsigned char c, base, mask, *s1, *s2, *s4, *s8;
++ unsigned i, len, idx, colors, x, y, width, height;
++
++ if (!grub_open(splashimage))
++ return (0);
++
++ /* read header */
++ if (!grub_read((char*)&buf, 10) || grub_memcmp(buf, "/* XPM */\n", 10)) {
++ grub_close();
++ return (0);
++ }
++
++ /* parse info */
++ while (grub_read(&c, 1)) {
++ if (c == '"')
++ break;
++ }
++
++ while (grub_read(&c, 1) && (c == ' ' || c == '\t'))
++ ;
++
++ i = 0;
++ width = c - '0';
++ while (grub_read(&c, 1)) {
++ if (c >= '0' && c <= '9')
++ width = width * 10 + c - '0';
++ else
++ break;
++ }
++ while (grub_read(&c, 1) && (c == ' ' || c == '\t'))
++ ;
++
++ height = c - '0';
++ while (grub_read(&c, 1)) {
++ if (c >= '0' && c <= '9')
++ height = height * 10 + c - '0';
++ else
++ break;
++ }
++ while (grub_read(&c, 1) && (c == ' ' || c == '\t'))
++ ;
++
++ colors = c - '0';
++ while (grub_read(&c, 1)) {
++ if (c >= '0' && c <= '9')
++ colors = colors * 10 + c - '0';
++ else
++ break;
++ }
++
++ base = 0;
++ while (grub_read(&c, 1) && c != '"')
++ ;
++
++ /* palette */
++ for (i = 0, idx = 1; i < colors; i++) {
++ len = 0;
++
++ while (grub_read(&c, 1) && c != '"')
++ ;
++ grub_read(&c, 1); /* char */
++ base = c;
++ grub_read(buf, 4); /* \t c # */
++
++ while (grub_read(&c, 1) && c != '"') {
++ if (len < sizeof(buf))
++ buf[len++] = c;
++ }
++
++ if (len == 6 && idx < 15) {
++ int r = ((hex(buf[0]) << 4) | hex(buf[1])) >> 2;
++ int g = ((hex(buf[2]) << 4) | hex(buf[3])) >> 2;
++ int b = ((hex(buf[4]) << 4) | hex(buf[5])) >> 2;
++
++ pal[idx] = base;
++ set_palette(idx, r, g, b);
++ ++idx;
++ }
++ }
++
++ x = y = len = 0;
++
++ s1 = (unsigned char*)VSHADOW1;
++ s2 = (unsigned char*)VSHADOW2;
++ s4 = (unsigned char*)VSHADOW4;
++ s8 = (unsigned char*)VSHADOW8;
++
++ for (i = 0; i < 38400; i++)
++ s1[i] = s2[i] = s4[i] = s8[i] = 0;
++
++ /* parse xpm data */
++ while (y < height) {
++ while (1) {
++ if (!grub_read(&c, 1)) {
++ grub_close();
++ return (0);
++ }
++ if (c == '"')
++ break;
++ }
++
++ while (grub_read(&c, 1) && c != '"') {
++ for (i = 1; i < 15; i++)
++ if (pal[i] == c) {
++ c = i;
++ break;
++ }
++
++ mask = 0x80 >> (x & 7);
++ if (c & 1)
++ s1[len + (x >> 3)] |= mask;
++ if (c & 2)
++ s2[len + (x >> 3)] |= mask;
++ if (c & 4)
++ s4[len + (x >> 3)] |= mask;
++ if (c & 8)
++ s8[len + (x >> 3)] |= mask;
++
++ if (++x >= 640) {
++ x = 0;
++
++ if (y < 480)
++ len += 80;
++ ++y;
++ }
++ }
++ }
++
++ grub_close();
++
++ set_palette(0, (background >> 16), (background >> 8) & 63, background & 63);
++ set_palette(15, (foreground >> 16), (foreground >> 8) & 63, foreground & 63);
++
++ set_palette(0x11, (border >> 16), (border >> 8) & 63, border & 63);
++
++ return (1);
++}
++
++int
++vga16_begin(void)
++{
++ if (vga_inited)
++ return (1);
++
++ if (!*splashimage)
++ grub_strcpy(splashimage, "/boot/grub/splash.xpm");
++
++ saved_videomode = set_videomode(0x12);
++ if (!read_image()) {
++ set_videomode(saved_videomode);
++ return (0);
++ }
++
++ font8x16 = (unsigned char*)get_font();
++
++ cursorWidth = 8;
++ cursorHeight = 16;
++
++ set_int1c_handler();
++
++ view_x0 = sx0;
++ view_y0 = sy0;
++ view_x1 = sx1;
++ view_y1 = sy1;
++
++ return (vga_inited = 1);
++}
++
++void
++vga16_end(void)
++{
++ if (vga_inited) {
++ unset_int1c_handler();
++ set_videomode(saved_videomode);
++ vga_inited = 0;
++ no_cursor = 0;
++ }
++
++ sx0 = view_x0;
++ sy0 = view_y0;
++ sx1 = view_x1;
++ sy1 = view_y1;
++ view_x0 = 0;
++ view_x1 = 80;
++ view_y0 = 0;
++ view_y1 = 25;
++}
++
++void
++vga16_cls(void)
++{
++ int i;
++ unsigned char *mem, *s1, *s2, *s4, *s8;
++
++ SetXY(view_x0, view_y0);
++
++ mem = (unsigned char*)VIDEO;
++ s1 = (unsigned char*)VSHADOW1;
++ s2 = (unsigned char*)VSHADOW2;
++ s4 = (unsigned char*)VSHADOW4;
++ s8 = (unsigned char*)VSHADOW8;
++
++ for (i = 0; i < 80 * 30; i++)
++ text[i] = ' ';
++
++ BitMask(0xff);
++
++ /* plano 1 */
++ MapMask(1);
++ grub_memcpy(mem, s1, 38400);
++
++ /* plano 2 */
++ MapMask(2);
++ grub_memcpy(mem, s2, 38400);
++
++ /* plano 3 */
++ MapMask(4);
++ grub_memcpy(mem, s4, 38400);
++
++ /* plano 4 */
++ MapMask(8);
++ grub_memcpy(mem, s8, 38400);
++
++ MapMask(15);
++
++ if (no_cursor) {
++ no_cursor = 0;
++ set_int1c_handler();
++ }
++}
++
++void
++vga16_gotoxy(int x, int y)
++{
++ cursor(0);
++
++ SetXY(x, y);
++
++ cursor(1);
++}
++
++static void
++scroll(void)
++{
++ int i, j;
++
++ if (no_scroll)
++ return;
++
++ no_scroll = 1;
++
++ for (j = view_y0 + 1; j < view_y1; j++) {
++ gotoxy(view_x0, j - 1);
++ for (i = view_x0; i < view_x1; i++)
++ putchar(text[j * 80 + i]);
++ }
++
++ gotoxy(view_x0, view_y1 - 1);
++ for (i = view_x0; i < view_x1; i++)
++ putchar(' ');
++
++ SetXY(view_x0, view_y1 - 1);
++
++ no_scroll = 0;
++}
++
++void
++vga16_putchar(int ch)
++{
++ ch &= 0xff;
++
++ cursor(0);
++
++ if (ch == '\n') {
++ SetXY(view_x0, fonty);
++ if (fonty + 1 < view_y1)
++ SetXY(view_x0, fonty + 1);
++ else
++ scroll();
++ cursor(1);
++ return;
++ }
++ else if (ch == '\r') {
++ SetXY(view_x0, fonty);
++ cursor(1);
++ return;
++ }
++
++ text[fonty * 80 + fontx] = ch;
++
++ cursor(0);
++
++ if ((fontx + 1) >= view_x1) {
++ SetXY(view_x0, fonty);
++ if (fonty + 1 < view_y1)
++ SetXY(view_x0, fonty + 1);
++ else
++ scroll();
++ }
++ else
++ SetXY(fontx + 1, fonty);
++
++ cursor(1);
++}
++
++int
++vga16_getxy()
++{
++ return ((fontx << 8) | fonty);
++}
++
++void
++vga16_nocursor()
++{
++ if (!no_cursor) {
++ no_cursor = 1;
++ unset_int1c_handler();
++ cursor(0);
++ }
++}
++
++void
++vga16_set_attrib(int attrib)
++{
++ text[fonty * 80 + fontx] &= 0x00ff;
++ if (attrib & 0xf0)
++ text[fonty * 80 + fontx] |= 0x100;
++ cursor(0);
++}
++#endif
+
+ /* This is the starting function in C. */
+ void
+@@ -924,6 +1499,14 @@
+ menu_entries = (char *) MENU_BUF;
+ init_config ();
+ }
++
++#ifdef VGA16
++ /* Make sure it points to a valid entry */
++ display = &display_entries[0];
++
++ if (ASCII_CHAR(checkkey()) == 0x1b)
++ vga_disabled = 1;
++#endif
+
+ /* Initialize the environment for restarting Stage 2. */
+ grub_setjmp (restart_env);
+@@ -1069,6 +1652,29 @@
+ while (is_preset);
+ }
+
++#ifdef VGA16
++ if (display_idx >= 0)
++ display = &display_entries[display_idx];
++ else if (!vga_disabled) {
++ display = &display_entries[1];
++ }
++ if (!viewport_set)
++ view_y1 = 30;
++ sx0 = view_x0;
++ sy0 = view_y0;
++ sx1 = view_x1;
++ sy1 = view_y1;
++
++ if (!display->Begin || !(*display->Begin)())
++ display = &display_entries[0];
++
++ if (!vga_inited) {
++ sx0 = sy0 = view_x0 = view_y0 = 0;
++ sx1 = view_x1 = 80;
++ sy1 = view_y1 = 25;
++ }
++#endif
++
+ if (! num_entries)
+ {
+ /* If no acceptable config file, goto command-line, starting
diff --git a/sys-apps/grub/files/grub-0.91/splash.xpm.gz b/sys-apps/grub/files/grub-0.91/splash.xpm.gz
new file mode 100644
index 000000000000..8abf87065af2
--- /dev/null
+++ b/sys-apps/grub/files/grub-0.91/splash.xpm.gz
Binary files differ
diff --git a/sys-apps/grub/grub-0.5.96.1-r4.ebuild b/sys-apps/grub/grub-0.5.96.1-r4.ebuild
deleted file mode 100644
index 6c429ae06d13..000000000000
--- a/sys-apps/grub/grub-0.5.96.1-r4.ebuild
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 1999-2001 Gentoo Technologies, Inc.
-# Distributed under the terms of the GNU General Public License, v2 or later
-# Author: Daniel Robbins <drobbins@gentoo.org>
-# $Header: /var/cvsroot/gentoo-x86/sys-apps/grub/grub-0.5.96.1-r4.ebuild,v 1.7 2001/10/06 17:04:49 drobbins Exp $
-
-S=${WORKDIR}/${P}
-DESCRIPTION="GNU GRUB boot loader"
-SRC_URI="ftp://alpha.gnu.org/gnu/grub/${P}.tar.gz"
-HOMEPAGE="http://www.gnu.org/software/grub"
-
-DEPEND="virtual/glibc >=sys-libs/ncurses-5.2-r2"
-
-src_unpack() {
- unpack ${A}
- cd ${S}
- patch -p1 < ${FILESDIR}/${PF}-gentoo.diff || die
-}
-
-src_compile() {
- ./configure --prefix=/usr sbindir=/sbin --mandir=/usr/share/man --infodir=/usr/share/info --host=${CHOST} || die
- emake -e CPPFLAGS="-Wall -Wmissing-prototypes -Wunused -Wshadow -malign-jumps=1 -malign-loops=1 -malign-functions=1 -Wundef" || die
-}
-
-src_install() {
- make prefix=${D}/usr sbindir=${D}/sbin mandir=${D}/usr/share/man infodir=${D}/usr/share/info install || die
- dodir /boot/grub
- cd ${D}/usr/share/grub/i386-pc
- cp stage1 stage2 *stage1_5 ${D}/boot/grub
- dosym . /boot/boot
- cd ${S}
- dodoc AUTHORS BUGS COPYING ChangeLog NEWS README THANKS TODO
-}
diff --git a/sys-apps/grub/grub-0.90-r3.ebuild b/sys-apps/grub/grub-0.90-r3.ebuild
deleted file mode 100644
index 80c2df8e9151..000000000000
--- a/sys-apps/grub/grub-0.90-r3.ebuild
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 1999-2000 Gentoo Technologies, Inc.
-# Distributed under the terms of the GNU General Public License, v2 or later
-# Author Mikael Hallendal <hallski@gentoo.org>
-# /home/cvsroot/gentoo-x86/sys-apps/grub/grub-0.5.96.1-r2.ebuild,v 1.2 2001/02/07 20:05:43 achim Exp
-# $Header: /var/cvsroot/gentoo-x86/sys-apps/grub/grub-0.90-r3.ebuild,v 1.1 2001/10/31 23:17:42 g2boojum Exp $
-
-
-A=${P}.tar.gz
-S=${WORKDIR}/${P}
-DESCRIPTION="GNU GRUB boot loader"
-SRC_URI="ftp://alpha.gnu.org/gnu/grub/${A}"
-HOMEPAGE="http://www.gnu.org/software/grub"
-
-DEPEND="virtual/glibc
- >=sys-libs/ncurses-5.2-r2"
-
-src_unpack() {
- unpack ${A}
- cd ${S}
- try patch -p1 < ${FILESDIR}/${P}/grub-0.5.97-vga16.patch
- try patch -p1 < ${FILESDIR}/${P}/grub-0.5.96.1-special-raid-devices.patch
- try patch -p1 < ${FILESDIR}/${P}/grub-0.5.96.1-dont-give-mem-to-kernel.patch
-# try patch -p1 < ${FILESDIR}/${P}/grub-0.90-configfile.patch
- try patch -p1 < ${FILESDIR}/${P}/grub-0.90-vga16-keypressclear.patch
- try patch -p1 < ${FILESDIR}/${P}/grub-0.90-passwordprompt.patch
- try patch -p1 < ${FILESDIR}/${P}/grub-0.90-install.in.patch
- try patch -p1 < ${FILESDIR}/${P}/grub-0.90-installcopyonly.patch
-}
-
-src_compile() {
-
- ./configure --prefix=/usr --sbindir=/sbin \
- --mandir=/usr/share/man --infodir=/usr/share/info \
- --host=${CHOST}
- assert "Configuration of package failed."
-
- # Have to do this since the configure-script seems a little brooken
- echo "#define VGA16 1" >> config.h
-
- emake -e CPPFLAGS="-Wall -Wmissing-prototypes -Wunused \
- -Wshadow -malign-jumps=1 -malign-loops=1 \
- -malign-functions=1 -Wundef"
- assert "Building failed."
-}
-
-src_install() {
-
- make prefix=${D}/usr sbindir=${D}/sbin mandir=${D}/usr/share/man \
- infodir=${D}/usr/share/info install
- assert "Installation failed."
-
- if [ -z "`use bootcd`" ]
- then
- dodir /boot/grub
- cd ${D}/usr/share/grub/i386-pc
- cp stage1 stage2 *stage1_5 ${D}/boot/grub
- cp ${FILESDIR}/${P}/splash.xpm.gz ${D}/boot/grub
-
- cd ${S}
- dodoc AUTHORS BUGS COPYING ChangeLog NEWS README THANKS TODO
- else
- rm -rf ${D}/usr/share/{man,info,doc}
- fi
-}
diff --git a/sys-apps/grub/grub-0.91.ebuild b/sys-apps/grub/grub-0.91.ebuild
new file mode 100644
index 000000000000..63658891307e
--- /dev/null
+++ b/sys-apps/grub/grub-0.91.ebuild
@@ -0,0 +1,72 @@
+# Copyright 1999-2002 Gentoo Technologies, Inc.
+# Distributed under the terms of the GNU General Public License, v2 or later
+# Maintainer: Mikael Hallendal <hallski@gentoo.org>
+# $Header: /var/cvsroot/gentoo-x86/sys-apps/grub/grub-0.91.ebuild,v 1.1 2002/01/29 15:58:41 gbevin Exp $
+
+
+S=${WORKDIR}/${P}
+DESCRIPTION="GNU GRUB boot loader"
+SRC_URI="ftp://alpha.gnu.org/gnu/grub/${P}.tar.gz"
+HOMEPAGE="http://www.gnu.org/software/grub"
+
+DEPEND="virtual/glibc
+ >=sys-devel/binutils-2.9.1.0.23
+ >=sys-libs/ncurses-5.2-r2"
+
+src_unpack() {
+
+ unpack ${A}
+ cd ${S}
+ patch -p1 < ${FILESDIR}/${P}/grub-0.91-vga16.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.5.96.1-dont-give-mem-to-kernel.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.90-vga16-keypressclear.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.90-passwordprompt.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.90-install.in.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.90-installcopyonly.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.90-symlinkmenulst.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.90-append.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.90-addsyncs.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.5.96.1-special-raid-devices.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.91-splashimagehelp.patch || die
+ patch -p1 < ${FILESDIR}/${P}/grub-0.91-initrdusemem.patch || die
+}
+
+src_compile() {
+
+ ./configure --prefix=/usr \
+ --sbindir=/sbin \
+ --mandir=/usr/share/man \
+ --infodir=/usr/share/info \
+ --host=${CHOST} || die "Configuration of package failed."
+
+ # Have to do this since the configure-script seems a little brooken
+ echo "#define VGA16 1" >> config.h
+ mv Makefile Makefile_orig
+ sed -e "s#config.h: stamp-h#config.h:#" Makefile_orig > Makefile
+
+ emake -e CPPFLAGS="-Wall -Wmissing-prototypes -Wunused \
+ -Wshadow -malign-jumps=1 -malign-loops=1 \
+ -malign-functions=1 -Wundef" || die "Building failed."
+}
+
+src_install() {
+
+ make prefix=${D}/usr \
+ sbindir=${D}/sbin \
+ mandir=${D}/usr/share/man \
+ infodir=${D}/usr/share/info \
+ install || die "Installation failed."
+
+ if [ -z "`use bootcd`" ]
+ then
+ dodir /boot/grub
+ cd ${D}/usr/share/grub/i386-pc
+ cp stage1 stage2 *stage1_5 ${D}/boot/grub
+ cp ${FILESDIR}/${P}/splash.xpm.gz ${D}/boot/grub
+
+ cd ${S}
+ dodoc AUTHORS BUGS COPYING ChangeLog NEWS README THANKS TODO
+ else
+ rm -rf ${D}/usr/share/{man,info,doc}
+ fi
+}