]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
osdep/hurd: Support device entries with @/dev/disk: qualifier
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Wed, 27 Apr 2022 21:00:29 +0000 (23:00 +0200)
committerDaniel Kiper <daniel.kiper@oracle.com>
Tue, 24 May 2022 12:18:45 +0000 (14:18 +0200)
Those are used with non-bootstrap disk drivers, for which libstore has to
open /dev/disk before calling device_open on it instead of on the device
master port. Normally in that case all /dev/ entries also have the @/dev/disk:
qualifier, so we can just drop it.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/osdep/hurd/getroot.c
grub-core/osdep/hurd/hostdisk.c

index c66b206fa0ab5fd3626bfc7ab41adba0482abd46..69af722068d5c6e9c2d199d03201d01bd20de581 100644 (file)
@@ -112,9 +112,23 @@ grub_util_find_hurd_root_device (const char *path)
   if (strncmp (name, "device:", sizeof ("device:") - 1) == 0)
     {
       char *dev_name = name + sizeof ("device:") - 1;
-      size_t size = sizeof ("/dev/") - 1 + strlen (dev_name) + 1;
+      size_t size;
       char *next;
-      ret = malloc (size);
+
+      if (dev_name[0] == '@')
+        {
+         /*
+          * Non-bootstrap disk driver, the /dev/ entry is normally set up with
+          * the same @.
+          */
+          char *next_name = strchr (dev_name, ':');
+
+          if (next_name)
+            dev_name = next_name + 1;
+        }
+
+      size = sizeof ("/dev/") - 1 + strlen (dev_name) + 1;
+      ret = xmalloc (size);
       next = stpncpy (ret, "/dev/", size);
       stpncpy (next, dev_name, size - (next - ret));
     }
index c47b5a5eaae4979dd81dbc6a0aeeb5b14ebbbbca..8196d8c0ec14b69c9dd9e3ae05948d419cb93141 100644 (file)
@@ -87,6 +87,23 @@ grub_util_hurd_get_disk_info (const char *dev, grub_uint32_t *secsize, grub_disk
          *parent = xmalloc (len+1);
          memcpy (*parent, data, len);
          (*parent)[len] = '\0';
+
+         if ((*parent)[0] == '@')
+           {
+             /*
+              * Non-bootstrap disk driver, the /dev/ entry is normally set up with
+              * the same @.
+              */
+             char *next_path = strchr (*parent, ':');
+
+             if (next_path)
+               {
+                 char *n = xstrdup (next_path + 1);
+
+                 free (*parent);
+                 *parent = n;
+               }
+           }
        }
     }
   if (offset)