On Sun, Feb 26, 2017, 16:22 Nicholas Vinson <nvinson...@gmail.com> wrote:
> From: Steve Kenton <address@hidden> > Please avoid resubmitting patches made by someone else in most cases. It obscures proper attribution. We can review his patch in his thread > > --- > grub-core/commands/probe.c | 59 > ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 59 insertions(+) > > diff --git a/grub-core/commands/probe.c b/grub-core/commands/probe.c > index cf2793e1d..5dd1a6bc5 100644 > --- a/grub-core/commands/probe.c > +++ b/grub-core/commands/probe.c > @@ -16,6 +16,7 @@ > * along with GRUB. If not, see <http://www.gnu.org/licenses/>. > */ > > +#include <stddef.h> > #include <grub/types.h> > #include <grub/misc.h> > #include <grub/mm.h> > @@ -24,6 +25,8 @@ > #include <grub/device.h> > #include <grub/disk.h> > #include <grub/partition.h> > +#include <grub/gpt_partition.h> > +#include <grub/i386/pc/boot.h> > #include <grub/net.h> > #include <grub/fs.h> > #include <grub/file.h> > @@ -45,6 +48,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 +158,61 @@ 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 */ > + /* Nested partitions are not supported for now. */ > + /* Non-nested partitions must have dev->disk->partition->parent == > NULL */ > + if (dev->disk && dev->disk->partition && > dev->disk->partition->parent == NULL) > + { > + grub_partition_t p = dev->disk->partition; > + if (grub_strcmp (p->partmap->name, "msdos") == 0) > + { > + /* little-endian 4-byte NT disk id "GUID" in the MBR */ > + grub_uint8_t diskid[4]; > + dev->disk->partition = p->parent; > + grub_uint32_t nt_disk_sig; > + err = grub_disk_read (dev->disk, 0, > GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC, sizeof(diskid), diskid); > + dev->disk->partition = p; > + if (err) > + return grub_errno; > + /* partition numbers are one-based */ > + partuuid = grub_xasprintf ("%02x%02x%02x%02x-%02x", > + diskid[3], diskid[2], diskid[1], > disk[0], > + p->number + 1); > + } > + else if (grub_strcmp (p->partmap->name, "gpt") == 0) > + { > + struct grub_gpt_partentry e; > + dev->disk->partition = p->parent; > + err = grub_disk_read (dev->disk, p->offset, p->index, sizeof > e, &e); > + 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", > + e.guid[3], e.guid[2], e.guid[1], > e.guid[0], > + e.guid[5], e.guid[4], > + e.guid[7], e.guid[6], > + e.guid[8], e.guid[9], > + e.guid[10], e.guid[11], > e.guid[12], e.guid[13], e.guid[14], e.guid[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.12.0 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel