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
 

Reply via email to