On Fri, 10 May 2019, 19:05 Jacob Kroon, <jacob.kr...@gmail.com> 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 <jacob.kr...@gmail.com> > --- > grub-core/commands/probe.c | 35 +++++++++++++++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > > Changes since v2: > > * Add a proper commit message > * Handle endianess in the same way as is currently done in > util/grub-probe.c:print_gpt_guid () > > diff --git a/grub-core/commands/probe.c b/grub-core/commands/probe.c > index 95d272287..24742c181 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}, > + {"partuuid", 'q', 0, N_("Determine GPT partition uuid."), 0, 0}, > {0, 0, 0, 0, 0, 0} > }; > > @@ -98,6 +100,39 @@ 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; > + guid->data1 = grub_le_to_cpu32 (guid->data1); > + guid->data2 = grub_le_to_cpu16 (guid->data2); > + guid->data3 = grub_le_to_cpu16 (guid->data3); > Please don't modify this in place. This can easily create hard to track endian-dependent bug. Instead you can transform them right before printing, in the same statement. Otherwise the patch is fine > + grub_snprintf (val, sizeof(val), > + > "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", > + guid->data1, guid->data2, 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 > 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