Hi Klaus!
On Sun, 07 Nov 1999, Klaus Reichl wrote:
>
> Here is the summary of patches against the current CVS rep. head. See
> ChangeLog and my last mail for comments.
>
> Happy hacking,
> KR
> --
> Klaus Reichl @ HOME email: [EMAIL PROTECTED]
>
> Index: ChangeLog
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/ChangeLog,v
> retrieving revision 1.166
> diff -u -r1.166 ChangeLog
> --- ChangeLog 1999/11/06 12:09:37 1.166
> +++ ChangeLog 1999/11/07 16:09:16
> @@ -1,3 +1,36 @@
> +1999-11-06 Klaus Reichl <[EMAIL PROTECTED]>
> +
> + * grub/asmstub.c (get_diskinfo) [__linux__]: After opening the
> + drive, flush the cache, other progs may have left over something
> + in the cache.
> +
> + * stage2/cmdline.c (enter_cmdline): Repeat if the user hits an
> + empty line (don't complain about unrecognized command in that
> + case).
> +
> + * stage2/disk_io.c (check_and_complete_partition): Try to open the
> + partition and if successful add a '/', to allow further <TAB>ing.
> + (print_completions): Use it for floppies and disks.
> +
> + * stage2/char_io.c (get_cmdline): Reset ERRNUM if
> + PRINT_COMPLETIONS fail.
> +
> + * stage2/builtins.c (root_func): If root is given without
> + argument, print the current root.
> + * docs/user-ref.texi (Command-line-specific commands): Document
> + it.
> +
> + * grub/main.c (OPT_ROOT): New option.
> + (longopts): --root
> + (usage): document.
> + (main): setup
> +
> + * grub/asmstub.c (root_device): New variable.
> + * stage2/shared.h: ditto.
> +
> + * stage2/stage2.c (cmain) [GRUB_UTIL]: In grub shell, check if a
> + root has been given, and set it up.
> +
> 1999-11-06 OKUJI Yoshinori <[EMAIL PROTECTED]>
>
> * grub/asmstub.c (grub_putchar) [HAVE_LIBCURSES]: Do not call
> Index: grub/asmstub.c
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/grub/asmstub.c,v
> retrieving revision 1.35
> diff -u -r1.35 asmstub.c
> --- asmstub.c 1999/11/06 12:09:45 1.35
> +++ asmstub.c 1999/11/07 16:09:23
> @@ -83,6 +83,7 @@
> unsigned long boot_drive = 0;
> char version_string[] = VERSION;
> char config_file[128] = "/boot/grub/menu.lst"; /* FIXME: arbitrary */
> +char root_device[128];
>
> /* Emulation requirements. */
> char *grub_scratch_mem = 0;
> @@ -915,6 +916,12 @@
> return -1;
> }
> }
> +
> +#ifdef __linux__
> + /* In Linux, invalidate the buffer cache, so that left overs
> + from other program in the cache are flushed and seen by us */
> + ioctl (disks[drive].flags, BLKFLSBUF, 0);
> +#endif
>
> /* Attempt to read the first sector. */
> if (read (disks[drive].flags, buf, 512) != 512)
> Index: grub/main.c
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/grub/main.c,v
> retrieving revision 1.13
> diff -u -r1.13 main.c
> --- main.c 1999/10/13 23:02:03 1.13
> +++ main.c 1999/11/07 16:09:25
> @@ -58,6 +58,7 @@
> #define OPT_PROBE_SECOND_FLOPPY -13
> #define OPT_NO_FLOPPY -14
> #define OPT_DEVICE_MAP -15
> +#define OPT_ROOT -16
> #define OPTSTRING ""
>
> static struct option longopts[] =
> @@ -74,6 +75,7 @@
> {"no-floppy", no_argument, 0, OPT_NO_FLOPPY},
> {"probe-second-floppy", no_argument, 0, OPT_PROBE_SECOND_FLOPPY},
> {"read-only", no_argument, 0, OPT_READ_ONLY},
> + {"root", required_argument, 0, OPT_ROOT},
> {"verbose", no_argument, 0, OPT_VERBOSE},
> {"version", no_argument, 0, OPT_VERSION},
> {0},
> @@ -103,6 +105,7 @@
> --no-floppy do not probe any floppy drive\n\
> --probe-second-floppy probe the second floppy drive\n\
> --read-only do not write anything to devices\n\
> + --root=DEVICE set boot_drive and install_partition from root\n\
> --verbose print verbose messages\n\
> --version print version information and exit\n\
> \n\
> @@ -179,6 +182,11 @@
> perror ("strtoul");
> exit (1);
> }
> + break;
> +
> + case OPT_ROOT:
> + strncpy (root_device, optarg, 127);
> + root_device[127] = '\0';
> break;
>
> case OPT_NO_CONFIG_FILE:
> Index: stage2/cmdline.c
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/stage2/cmdline.c,v
> retrieving revision 1.13
> diff -u -r1.13 cmdline.c
> --- cmdline.c 1999/10/29 04:33:02 1.13
> +++ cmdline.c 1999/11/07 16:09:26
> @@ -124,9 +124,15 @@
> print_error ();
> errnum = ERR_NONE;
>
> - /* Get the command-line with the minimal BASH-like interface. */
> - if (get_cmdline (PACKAGE "> ", heap, 2048, 0, 1))
> - return;
> + /* Get the command-line with the minimal BASH-like interface.
> + Repeat until we see something on the cmdline. */
> + do
> + {
> + *heap = 0;
> + if (get_cmdline (PACKAGE "> ", heap, 2048, 0, 1))
> + return;
> + }
> + while (heap [0] == '\0' || heap [0] == '#');
>
> /* Find a builtin. */
> builtin = find_command (heap);
> Index: stage2/disk_io.c
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/stage2/disk_io.c,v
> retrieving revision 1.21
> diff -u -r1.21 disk_io.c
> --- disk_io.c 1999/11/02 12:54:17 1.21
> +++ disk_io.c 1999/11/07 16:09:35
> @@ -1005,6 +1005,28 @@
> * any sane combination of the two.
> */
>
> +static int
> +check_and_complete_partition (char * ptr)
> +{
> + if (open_partition ())
> + {
> + /* OK add the '/' */
> + if (*(ptr - 1) != ')')
> + {
> + *ptr++ = ')';
> + *ptr = 0;
> + }
> + if (*(ptr - 1) != '/')
> + {
> + *ptr++ = '/';
> + *ptr = 0;
> + }
> + return 1;
> + }
> + else
> + return 0;
> +}
> +
> int
> print_completions (int is_filename, int is_completion)
> {
> @@ -1104,8 +1126,7 @@
> }
> else
> {
> - *ptr++ = ')';
> - *ptr = 0;
> + check_and_complete_partition (ptr);
> }
> }
> }
> @@ -1131,18 +1152,8 @@
> }
> }
> else
> - {
> - if (open_partition ())
> - {
> - unique = 1;
> - ptr = buf + grub_strlen (buf);
> - if (*(ptr - 1) != ')')
> - {
> - *ptr++ = ')';
> - *ptr = 0;
> - }
> - }
> - }
> + unique =
> + check_and_complete_partition (buf + grub_strlen (buf));
> }
> }
> else if (ptr && *ptr == '/')
> Index: stage2/char_io.c
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/stage2/char_io.c,v
> retrieving revision 1.18
> diff -u -r1.18 char_io.c
> --- char_io.c 1999/11/02 12:54:16 1.18
> +++ char_io.c 1999/11/07 16:09:39
> @@ -419,6 +419,10 @@
> print_completions (is_filename, 0);
> }
> }
> + else
> + /* if print_completions signals an error make sure we
> + don't leave this hanging */
> + errnum = ERR_NONE;
>
> /* Restore the command-line. */
> if (equal_pos >= 0)
> Index: stage2/builtins.c
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/stage2/builtins.c,v
> retrieving revision 1.36
> diff -u -r1.36 builtins.c
> --- builtins.c 1999/11/06 12:09:46 1.36
> +++ builtins.c 1999/11/07 16:09:56
> @@ -1849,6 +1849,35 @@
> char *biasptr;
> char *next;
>
> + /* If arg is empty just print current value */
> + if (!arg[0])
> + {
> + /* check if drive/partition is plausible */
> + if (!open_partition ())
> + grub_printf (" Current drive 0x%x, current partition 0x%x\n",
> + current_drive, current_partition);
> + else
> + {
> + grub_printf (" root=(");
> + if (current_drive == 0x20)
> + grub_printf ("nd");
> + else if (current_drive >= 0x80)
> + {
> + grub_printf ("hd%d,%d",
> + current_drive - 0x80,
> + /* XXX: Is this correct in any case? */
> + current_partition >> 16);
> + }
> + else
> + {
> + grub_printf ("fd%d", current_drive);
> + }
> + grub_printf (")\n");
> + }
> +
> + return 0;
> + }
> +
> /* Call set_device to get the drive and the partition in ARG. */
> next = set_device (arg);
> if (! next)
> Index: stage2/stage2.c
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/stage2/stage2.c,v
> retrieving revision 1.9
> diff -u -r1.9 stage2.c
> --- stage2.c 1999/10/29 04:33:04 1.9
> +++ stage2.c 1999/11/07 16:10:00
> @@ -583,6 +583,24 @@
> /* Initialize the kill buffer. */
> *kill = 0;
>
> +#ifdef GRUB_UTIL
> + /* Setup possible root given by user */
> + if (root_device[0])
> + {
> + struct builtin *builtin;
> +
> + builtin = find_command ("root");
> + if ((builtin->func) (root_device, BUILTIN_CMDLINE))
> + {
> + extern int sleep (int secs); /* XXX */
> +
> + grub_printf ("\nError: %s\n", err_list[errnum]);
> + /* How to tell the user, that something goes wrong here? */
> + sleep (2);
> + }
> + }
> +#endif
> +
> /* Never return. */
> for (;;)
> {
> Index: stage2/shared.h
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/stage2/shared.h,v
> retrieving revision 1.32
> diff -u -r1.32 shared.h
> --- shared.h 1999/11/02 12:54:19 1.32
> +++ shared.h 1999/11/07 16:10:06
> @@ -430,6 +430,8 @@
> extern char **device_map;
> /* The filename which stores the information about a device map. */
> extern char *device_map_file;
> +/* The root device specified by the user */
> +extern char root_device[];
> /* The array of geometries. */
> extern struct geometry *disks;
> /* Check if DEVICE can be read. If an error occurs, return zero,
> Index: docs/user-ref.texi
> ===================================================================
> RCS file: /gd/gnu/anoncvsroot/grub/docs/user-ref.texi,v
> retrieving revision 1.10
> diff -u -r1.10 user-ref.texi
> --- user-ref.texi 1999/11/03 08:44:57 1.10
> +++ user-ref.texi 1999/11/07 16:10:19
> @@ -921,8 +921,8 @@
> hex format.
> @end deffn
>
> -@deffn Command root device [hdbias]
> -Set the current @dfn{root device} to the device @var{device}, then
> +@deffn Command root [device [hdbias]]
> +Print or set the current @dfn{root device} to the device @var{device}, then
> attempt to mount it to get the partition size (for passing the partition
> descriptor in @code{ES:ESI}, used by some chain-loaded boot loaders), the
> BSD drive-type (for booting BSD kernels using their native boot format),
>
--
Daniel Wagner
email: [EMAIL PROTECTED]
(RSA)PGP - Key auf Anfrage, (RSA)PGP - Key on request