grub-devel
[Top][All Lists]
Advanced

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

Re: [PATCH v5] probe: Support probing for GPT partition UUID with -g


From: Vladimir 'phcoder' Serbinenko
Subject: Re: [PATCH v5] probe: Support probing for GPT partition UUID with -g
Date: Tue, 14 May 2019 03:10:33 +0700

Ideally the option shouldn't be specific to GPT as other partmaps also have stable IDs. I think it's better not to have short option at all

On Mon, 13 May 2019, 20:33 Jacob Kroon, <address@hidden> wrote:
Linux supports root=PARTUUID=<partuuid> boot argument, so add
support for probing it. Compared to the fs UUID, the partition
UUID does not change when reformatting a partition.

Signed-off-by: Jacob Kroon <address@hidden>
---
 docs/grub.texi             |  2 +-
 grub-core/commands/probe.c | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

Changes since v4:
 * Do endianess byte-swapping on the fly when formatting string

diff --git a/docs/grub.texi b/docs/grub.texi
index 308b25074..d85818744 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -4771,7 +4771,7 @@ a rest.
address@hidden probe
address@hidden probe

address@hidden Command probe address@hidden var] @option{--driver}|@option{--partmap}|@option{--fs}|@option{--fs-uuid}|@option{--label} device
address@hidden Command probe address@hidden var] @option{--driver}|@option{--partmap}|@option{--fs}|@option{--fs-uuid}|@option{--label}|@option{--part-uuid} device
 Retrieve device information. If option @option{--set} is given, assign result
 to variable @var{var}, otherwise print information on the screen.
address@hidden deffn
diff --git a/grub-core/commands/probe.c b/grub-core/commands/probe.c
index 95d272287..b26cbe2cc 100644
--- a/grub-core/commands/probe.c
+++ b/grub-core/commands/probe.c
@@ -24,6 +24,7 @@
 #include <grub/device.h>
 #include <grub/disk.h>
 #include <grub/partition.h>
+#include <grub/gpt_partition.h>
 #include <grub/net.h>
 #include <grub/fs.h>
 #include <grub/file.h>
@@ -45,6 +46,7 @@ static const struct grub_arg_option options[] =
     {"fs",             'f', 0, N_("Determine filesystem type."), 0, 0},
     {"fs-uuid",                'u', 0, N_("Determine filesystem UUID."), 0, 0},
     {"label",          'l', 0, N_("Determine filesystem label."), 0, 0},
+    {"part-uuid",      'g', 0, N_("Determine GPT partition UUID."), 0, 0},
     {0, 0, 0, 0, 0, 0}
   };

@@ -98,6 +100,38 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
       grub_device_close (dev);
       return GRUB_ERR_NONE;
     }
+  if (state[6].set)
+    {
+      /* AAAABBBB-CCCC-DDDD-EEEE-FFFFFFFFFFFF + null terminator */
+      char val[37] = "none";
+      if (dev->disk && dev->disk->partition &&
+         grub_strcmp(dev->disk->partition->partmap->name, "gpt") == 0)
+       {
+         struct grub_gpt_partentry entry;
+         struct grub_partition *p = dev->disk->partition;
+         grub_disk_t disk = grub_disk_open(dev->disk->name);
+         if (!disk)
+           return grub_errno;
+         if (grub_disk_read(disk, p->offset, p->index, sizeof(entry), &entry))
+           return grub_errno;
+         grub_disk_close(disk);
+         grub_gpt_part_guid_t *guid = &entry.guid;
+         grub_snprintf (val, sizeof(val),
+                        "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+                        grub_le_to_cpu32 (guid->data1),
+                        grub_le_to_cpu16 (guid->data2),
+                        grub_le_to_cpu16 (guid->data3),
+                        guid->data4[0], guid->data4[1], guid->data4[2],
+                        guid->data4[3], guid->data4[4], guid->data4[5],
+                        guid->data4[6], guid->data4[7]);
+       }
+      if (state[0].set)
+       grub_env_set (state[0].arg, val);
+      else
+       grub_printf ("%s", val);
+      grub_device_close (dev);
+      return GRUB_ERR_NONE;
+    }
   fs = grub_fs_probe (dev);
   if (! fs)
     return grub_errno;
--
2.20.1


_______________________________________________
Grub-devel mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/grub-devel

reply via email to

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