All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] add --partuuid to probe
@ 2017-02-14 18:00 Steve Kenton
  2017-02-14 19:12 ` Andrei Borzenkov
  2017-02-15 10:56 ` Vladimir 'phcoder' Serbinenko
  0 siblings, 2 replies; 19+ messages in thread
From: Steve Kenton @ 2017-02-14 18:00 UTC (permalink / raw)
  To: grub-devel; +Cc: Steve Kenton

Support both EFI and NT Disk Signature for passing to kernel as root=PARTUUID=$val

Signed-off-by: Steve Kenton <skenton@ou.edu>
---
It's been six months so I thought I'd resend this so it does not get lost
in case I get hit by a meteor or something before the next release

 grub-core/commands/probe.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/grub-core/commands/probe.c b/grub-core/commands/probe.c
index cf2793e..3afc8b8 100644
--- a/grub-core/commands/probe.c
+++ b/grub-core/commands/probe.c
@@ -45,6 +45,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},
+    {"partuuid",	'g', 0, N_("Determine partition GUID/UUID."), 0, 0}, /* GUID but Linux kernel calls it "PARTUUID" */
     {0, 0, 0, 0, 0, 0}
   };
 
@@ -154,6 +155,58 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
       grub_device_close (dev);
       return GRUB_ERR_NONE;
     }
+  if (state[6].set)
+    {
+      char *partuuid = NULL; /* NULL to silence a spurious GCC warning */
+      grub_uint8_t diskbuf[16];
+      if (dev->disk && dev->disk->partition)
+	{
+	  grub_partition_t p = dev->disk->partition;
+	  if (!grub_strcmp (p->partmap->name, "msdos"))
+	    {
+	      const int diskid_offset = 440; /* location in MBR */
+	      dev->disk->partition = p->parent;
+	      /* little-endian 4-byte NT disk signature */
+	      err = grub_disk_read (dev->disk, 0, diskid_offset, 4, diskbuf);
+	      dev->disk->partition = p;
+	      if (err)
+	        return grub_errno;
+	      partuuid = grub_xasprintf ("%02x%02x%02x%02x-%02x",
+					 diskbuf[3], diskbuf[2], diskbuf[1], diskbuf[0],
+					 p->number + 1); /* one based partition number */
+	    }
+	  else if (!grub_strcmp (p->partmap->name, "gpt"))
+	    {
+	      const int guid_offset = 16; /* location in entry */
+	      dev->disk->partition = p->parent;
+	      /* little-endian 16-byte EFI partition GUID */
+	      err = grub_disk_read (dev->disk, p->offset, p->index + guid_offset, 16, diskbuf);
+	      dev->disk->partition = p;
+	      if (err)
+	        return grub_errno;
+	      partuuid = grub_xasprintf ("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+					 diskbuf[3], diskbuf[2], diskbuf[1], diskbuf[0],
+					 diskbuf[5], diskbuf[4],
+					 diskbuf[7], diskbuf[6],
+					 diskbuf[8], diskbuf[9],
+					 diskbuf[10], diskbuf[11], diskbuf[12], diskbuf[13], diskbuf[14], diskbuf[15]);
+	    }
+	  else
+	    return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
+			       N_("partition map %s does not support partition UUIDs"),
+			       dev->disk->partition->partmap->name);
+	}
+      else
+	partuuid = grub_strdup (""); /* a freeable empty string */
+
+      if (state[0].set)
+	grub_env_set (state[0].arg, partuuid);
+      else
+	grub_printf ("%s", partuuid);
+      grub_free (partuuid);
+      grub_device_close (dev);
+      return GRUB_ERR_NONE;
+    }
   grub_device_close (dev);
   return grub_error (GRUB_ERR_BAD_ARGUMENT, "unrecognised target");
 }
-- 
2.9.0.137.gcf4c2cf



^ permalink raw reply related	[flat|nested] 19+ messages in thread
* [PATCH 1/1] add --partuuid to probe
@ 2016-08-16 14:56 Steve Kenton
  0 siblings, 0 replies; 19+ messages in thread
From: Steve Kenton @ 2016-08-16 14:56 UTC (permalink / raw)
  To: grub-devel; +Cc: Steve Kenton

Supports both EFI and NT Disk Signature for passing to kernel as root=PARTUUID=$val

Signed-off-by: Steve Kenton <skenton@ou.edu>
---
This passed light testing here, giving correct results for both types compared to blkid

 grub-core/commands/probe.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/grub-core/commands/probe.c b/grub-core/commands/probe.c
index cf2793e..0473d39 100644
--- a/grub-core/commands/probe.c
+++ b/grub-core/commands/probe.c
@@ -45,6 +45,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},
+    {"partuuid",	'g', 0, N_("Determine partition UUID."), 0, 0}, /* 'g' for guid since 'u' was taken */
     {0, 0, 0, 0, 0, 0}
   };
 
@@ -154,6 +155,58 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
       grub_device_close (dev);
       return GRUB_ERR_NONE;
     }
+  if (state[6].set)
+    {
+      char *partuuid = NULL; /* NULL to silence a spurious GCC warning */
+      grub_uint8_t diskbuf[16];
+      if (dev->disk && dev->disk->partition)
+	{
+	  grub_partition_t p = dev->disk->partition;
+	  if (!grub_strcmp (p->partmap->name, "msdos"))
+	    {
+	      const int diskid_offset = 440; /* location in MBR */
+	      dev->disk->partition = p->parent;
+	      /* little-endian 4-byte NT disk signature */
+	      err = grub_disk_read (dev->disk, 0, diskid_offset, 4, diskbuf);
+	      dev->disk->partition = p;
+	      if (err)
+	        return grub_errno;
+	      partuuid = grub_xasprintf ("%02x%02x%02x%02x-%02x",
+					 diskbuf[3], diskbuf[2], diskbuf[1], diskbuf[0],
+					 p->number + 1); /* one based partition number */
+	    }
+	  else if (!grub_strcmp (p->partmap->name, "gpt"))
+	    {
+	      const int guid_offset = 16; /* location in entry */
+	      dev->disk->partition = p->parent;
+	      /* little-endian 16-byte EFI partition GUID */
+	      err = grub_disk_read (dev->disk, p->offset, p->index + guid_offset, 16, diskbuf);
+	      dev->disk->partition = p;
+	      if (err)
+	        return grub_errno;
+	      partuuid = grub_xasprintf ("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+					 diskbuf[3], diskbuf[2], diskbuf[1], diskbuf[0],
+					 diskbuf[5], diskbuf[4],
+					 diskbuf[7], diskbuf[6],
+					 diskbuf[8], diskbuf[9],
+					 diskbuf[10], diskbuf[11], diskbuf[12], diskbuf[13], diskbuf[14], diskbuf[15]);
+	    }
+	  else
+	    return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
+			       N_("partition map %s does not support partition UUIDs"),
+			       dev->disk->partition->partmap->name);
+	}
+      else
+	partuuid = grub_strdup (""); /* a freeable empty string */
+
+      if (state[0].set)
+	grub_env_set (state[0].arg, partuuid);
+      else
+	grub_printf ("%s", partuuid);
+      grub_free (partuuid);
+      grub_device_close (dev);
+      return GRUB_ERR_NONE;
+    }
   grub_device_close (dev);
   return grub_error (GRUB_ERR_BAD_ARGUMENT, "unrecognised target");
 }
-- 
2.9.0.137.gcf4c2cf



^ permalink raw reply related	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2017-03-01  3:39 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-14 18:00 [PATCH 1/1] add --partuuid to probe Steve Kenton
2017-02-14 19:12 ` Andrei Borzenkov
2017-02-14 19:39   ` Steve Kenton
2017-02-15  3:36     ` Nick Vinson
2017-02-15 10:56 ` Vladimir 'phcoder' Serbinenko
2017-02-15 16:26   ` Andrei Borzenkov
2017-02-15 17:25     ` Vladimir 'phcoder' Serbinenko
2017-02-19  6:12       ` Andrei Borzenkov
2017-02-27  0:37         ` Vladimir 'phcoder' Serbinenko
2017-02-27 17:53           ` Andrei Borzenkov
2017-02-27 18:20             ` Vladimir 'phcoder' Serbinenko
2017-02-28  4:11               ` Andrei Borzenkov
2017-02-28 14:08                 ` Vladimir 'phcoder' Serbinenko
2017-02-28 17:13                   ` grub-probe for nested BSD partition on Linux (was: [PATCH 1/1] add --partuuid to probe) Andrei Borzenkov
2017-02-28 18:31                     ` Lennart Sorensen
2017-02-28 18:50                       ` grub-probe for nested BSD partition on Linux Andrei Borzenkov
2017-02-28 22:05                         ` Lennart Sorensen
2017-03-01  3:39                           ` Andrei Borzenkov
  -- strict thread matches above, loose matches on Subject: below --
2016-08-16 14:56 [PATCH 1/1] add --partuuid to probe Steve Kenton

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.