grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] register dummy drive


From: Robert Millan
Subject: Re: [PATCH] register dummy drive
Date: Mon, 2 Jun 2008 16:12:23 +0200
User-agent: Mutt/1.5.13 (2006-08-11)

Uhm.. however, you still need device-specific knowledge to find the full device
containing your partition (needed for -t partmap).

I'm not sure if there's a point to continue in this direction.  Should we
just exclude partmap from this?

On Mon, Jun 02, 2008 at 03:50:14PM +0200, Robert Millan wrote:
> 
> There's no reason grub-probe should fail if it can't resolve drive, when we
> just asked for -t fs, -t fs_uuid or -t partmap.
> 
> This patch solves the problem by spliting device/drive map[] entry 
> registration
> into a separate function, and using that from grub-probe.c to register a dummy
> drive that will last during the current execution.
> 
> It's diffed relative to my previous patch for device function names (but if
> we need to change something in that one, not a problem for me to readapt it,
> of course).
> 
> -- 
> Robert Millan
> 
> <GPLv2> I know my rights; I want my phone call!
> <DRM> What good is a phone call… if you are unable to speak?
> (as seen on /.)

> 2008-06-02  Robert Millan  <address@hidden>
> 
>       * include/grub/util/biosdisk.h (grub_util_biosdisk_register): New
>       function declaration.
>       * util/biosdisk.c (open_device): Remove first grub_util_info() call
>       (too verbose).
>       (grub_util_biosdisk_register): New function.
>       (read_device_map): Use grub_util_biosdisk_register() for registration
>       of drive/device entries rather than doing it ourselves.
>       * util/grub-probe.c (probe): If we weren't asked to -t drive, allow
>       grub_util_get_grub_dev() to fail by registering a dummy drive entry,
>       so that other options like -t fs, -t fs_uuid or -t partmap will work
>       regardless.
> 
> diff -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp 
> ../tmp.old/include/grub/util/biosdisk.h ./include/grub/util/biosdisk.h
> --- ../tmp.old/include/grub/util/biosdisk.h   2007-07-22 01:32:25.000000000 
> +0200
> +++ ./include/grub/util/biosdisk.h    2008-06-02 15:33:49.000000000 +0200
> @@ -23,5 +23,6 @@
>  void grub_util_biosdisk_init (const char *dev_map);
>  void grub_util_biosdisk_fini (void);
>  char *grub_util_biosdisk_get_grub_dev (const char *os_dev);
> +int grub_util_biosdisk_register (char *device, char *drive);
>  
>  #endif /* ! GRUB_BIOSDISK_MACHINE_UTIL_HEADER */
> diff -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp 
> ../tmp.old/util/biosdisk.c ./util/biosdisk.c
> --- ../tmp.old/util/biosdisk.c        2008-06-02 15:41:31.000000000 +0200
> +++ ./util/biosdisk.c 2008-06-02 15:38:13.000000000 +0200
> @@ -288,7 +288,6 @@ open_device (const grub_disk_t disk, gru
>        is_partition = linux_find_partition (dev, disk->partition->start);
>      
>      /* Open the partition.  */
> -    grub_util_info ("opening the device `%s'", dev);
>      fd = open (dev, flags);
>      if (fd < 0)
>        {
> @@ -464,6 +463,20 @@ static struct grub_disk_dev grub_util_bi
>      .next = 0
>    };
>  
> +/* Registers a device/drive map.  */
> +int
> +grub_util_biosdisk_register (char *device, char *drive)
> +{
> +  int index;
> +  /* Find a free slot.  */
> +  index = find_grub_drive (NULL);
> +  if (index < 0)
> +    return -1;
> +  map[index].device = device;
> +  map[index].drive = drive;
> +  return 0;
> +}
> +
>  static void
>  read_device_map (const char *dev_map)
>  {
> @@ -486,7 +499,7 @@ read_device_map (const char *dev_map)
>      {
>        char *p = buf;
>        char *e;
> -      int drive;
> +      char *device, *drive;
>        
>        lineno++;
>        
> @@ -502,19 +515,14 @@ read_device_map (const char *dev_map)
>       show_error ("No open parenthesis found");
>  
>        p++;
> -      /* Find a free slot.  */
> -      drive = find_grub_drive (NULL);
> -      if (drive < 0)
> -     show_error ("Map table size exceeded");
> -
>        e = p;
>        p = strchr (p, ')');
>        if (! p)
>       show_error ("No close parenthesis found");
>  
> -      map[drive].drive = xmalloc (p - e + sizeof ('\0'));
> -      strncpy (map[drive].drive, e, p - e + sizeof ('\0'));
> -      map[drive].drive[p - e] = '\0';
> +      drive = xmalloc (p - e + sizeof ('\0'));
> +      strncpy (drive, e, p - e + sizeof ('\0'));
> +      drive[p - e] = '\0';
>  
>        p++;
>        /* Skip leading spaces.  */
> @@ -540,12 +548,13 @@ read_device_map (const char *dev_map)
>        /* On Linux, the devfs uses symbolic links horribly, and that
>        confuses the interface very much, so use realpath to expand
>        symbolic links.  */
> -      map[drive].device = xmalloc (PATH_MAX);
> -      if (! realpath (p, map[drive].device))
> +      device = xmalloc (PATH_MAX);
> +      if (! realpath (p, device))
>       grub_util_error ("Cannot get the real path of `%s'", p);
>  #else
> -      map[drive].device = xstrdup (p);
> +      device = xstrdup (p);
>  #endif
> +      grub_util_biosdisk_register (device, drive);
>      }
>  
>    fclose (fp);
> diff -x configure -x config.h.in -x CVS -x '*~' -x '*.mk' -urp 
> ../tmp.old/util/grub-probe.c ./util/grub-probe.c
> --- ../tmp.old/util/grub-probe.c      2008-05-30 13:07:10.000000000 +0200
> +++ ./util/grub-probe.c       2008-06-02 15:40:52.000000000 +0200
> @@ -153,15 +153,25 @@ probe (const char *path, char *device_na
>      }
>  
>    drive_name = grub_util_get_grub_dev (device_name);
> -  if (! drive_name)
> -    grub_util_error ("Cannot find a GRUB drive for %s.  Check your 
> device.map.\n", device_name);
>    
>    if (print == PRINT_DRIVE)
>      {
> +      if (! drive_name)
> +     grub_util_error ("Cannot find a GRUB drive for %s.  Check your 
> device.map.\n", device_name);
> +
>        printf ("(%s)\n", drive_name);
>        goto end;
>      }
>  
> +  /* For the purpose of checks that follow, a dummy drive name will do.  */
> +  if (! drive_name)
> +    {
> +      drive_name = "dummy-grub-drive";
> +      grub_util_info ("Cannot find GRUB drive for %s.  Registering 
> \"(%s)\t%s\".",
> +                   device_name, drive_name, device_name);
> +      grub_util_biosdisk_register (xstrdup (device_name), xstrdup 
> (drive_name));
> +    }
> +
>    grub_util_info ("opening %s", drive_name);
>    dev = grub_device_open (drive_name);
>    if (! dev)


-- 
Robert Millan

<GPLv2> I know my rights; I want my phone call!
<DRM> What good is a phone call… if you are unable to speak?
(as seen on /.)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]