grub-devel
[Top][All Lists]
Advanced

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

[GRUB PARTUUID PATCH V2 1/2] Add PARTUUID detection support to grub-prob


From: Nicholas Vinson
Subject: [GRUB PARTUUID PATCH V2 1/2] Add PARTUUID detection support to grub-probe
Date: Sat, 6 Aug 2016 18:56:31 -0700

Add PARTUUID detection to grub-probe.  The grub-probe utility is used by
grub-mkconfig to determine the filesystem [GU]UID, so updating it to be
able to return partition [GU]UIDs seemed like the natural choice.  The
other obvious choice was to rely on Linux userland tools and /dev file
structure which would added to the runtime dependencies of grub-probe.

Signed-off-by: Nicholas Vinson <address@hidden>
---
 util/grub-probe.c | 83 +++++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 68 insertions(+), 15 deletions(-)

diff --git a/util/grub-probe.c b/util/grub-probe.c
index 8ac527d..97daac6 100644
--- a/util/grub-probe.c
+++ b/util/grub-probe.c
@@ -62,6 +62,7 @@ enum {
   PRINT_DRIVE,
   PRINT_DEVICE,
   PRINT_PARTMAP,
+  PRINT_PARTUUID,
   PRINT_ABSTRACTION,
   PRINT_CRYPTODISK_UUID,
   PRINT_HINT_STR,
@@ -85,6 +86,7 @@ static const char *targets[] =
     [PRINT_DRIVE]              = "drive",
     [PRINT_DEVICE]             = "device",
     [PRINT_PARTMAP]            = "partmap",
+    [PRINT_PARTUUID]           = "partuuid",
     [PRINT_ABSTRACTION]        = "abstraction",
     [PRINT_CRYPTODISK_UUID]    = "cryptodisk_uuid",
     [PRINT_HINT_STR]           = "hints_string",
@@ -168,6 +170,65 @@ probe_partmap (grub_disk_t disk, char delim)
 }
 
 static void
+print_gpt_guid(const struct grub_gpt_partentry gptdata)
+{
+  grub_gpt_part_type_t gpttype;
+  gpttype.data1 = grub_le_to_cpu32 (gptdata.type.data1);
+  gpttype.data2 = grub_le_to_cpu16 (gptdata.type.data2);
+  gpttype.data3 = grub_le_to_cpu16 (gptdata.type.data3);
+  grub_memcpy (gpttype.data4, gptdata.type.data4, 8);
+
+  grub_printf ("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+              gpttype.data1, gpttype.data2, gpttype.data3, gpttype.data4[0],
+              gpttype.data4[1], gpttype.data4[2], gpttype.data4[3],
+              gpttype.data4[4], gpttype.data4[5], gpttype.data4[6],
+              gpttype.data4[7]);
+}
+
+static void
+probe_partuuid (grub_disk_t disk, char delim)
+{
+  if (disk->partition)
+    {
+      if (strcmp(disk->partition->partmap->name, "gpt") == 0)
+       {
+         const int guid_offset = 16;
+
+         grub_partition_t p = disk->partition;
+         struct grub_gpt_partentry gptdata;
+
+         disk->partition = p->parent;
+
+         if (grub_disk_read (disk, p->offset, p->index + guid_offset,
+                             sizeof(gptdata), &gptdata) == 0)
+           print_gpt_guid (gptdata);
+
+         disk->partition = p;
+       }
+      else if (strcmp(disk->partition->partmap->name, "msdos") == 0)
+       {
+           /*
+            * The partition GUID for MSDOS is the partition number (starting
+            * with 1) prepended with the NT disk signature.
+            */
+           const int nt_disk_sig_offset = 440;
+           grub_uint32_t nt_disk_sig;
+           grub_partition_t p = disk->partition;
+
+           disk->partition = p->parent;
+
+           if (grub_disk_read (disk, 0, nt_disk_sig_offset, 
sizeof(nt_disk_sig),
+                               &nt_disk_sig) == 0)
+             {
+               nt_disk_sig = grub_le_to_cpu32(nt_disk_sig);
+               grub_printf ("%08x-%02x", nt_disk_sig, 1 + p->number);
+             }
+           disk->partition = p;
+       }
+    }
+}
+
+static void
 probe_cryptodisk_uuid (grub_disk_t disk, char delim)
 {
   grub_disk_memberlist_t list = NULL, tmp;
@@ -621,6 +682,12 @@ probe (const char *path, char **device_names, char delim)
        /* Check if dev->disk itself is contained in a partmap.  */
        probe_partmap (dev->disk, delim);
 
+      else if (print == PRINT_PARTUUID)
+       {
+         probe_partuuid (dev->disk, delim);
+         putchar (delim);
+       }
+
       else if (print == PRINT_MSDOS_PARTTYPE)
        {
          if (dev->disk->partition
@@ -641,21 +708,7 @@ probe (const char *path, char **device_names, char delim)
 
               if (grub_disk_read (dev->disk, p->offset, p->index,
                                   sizeof (gptdata), &gptdata) == 0)
-                {
-                  grub_gpt_part_type_t gpttype;
-                  gpttype.data1 = grub_le_to_cpu32 (gptdata.type.data1);
-                  gpttype.data2 = grub_le_to_cpu16 (gptdata.type.data2);
-                  gpttype.data3 = grub_le_to_cpu16 (gptdata.type.data3);
-                  grub_memcpy (gpttype.data4, gptdata.type.data4, 8);
-
-                  grub_printf 
("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-                               gpttype.data1, gpttype.data2,
-                               gpttype.data3, gpttype.data4[0], 
-                               gpttype.data4[1], gpttype.data4[2],
-                               gpttype.data4[3], gpttype.data4[4],
-                               gpttype.data4[5], gpttype.data4[6],
-                               gpttype.data4[7]);
-                }
+               print_gpt_guid(gptdata);
               dev->disk->partition = p;
             }
           putchar (delim);
-- 
2.9.2




reply via email to

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