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 <nvinson...@gmail.com> --- 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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel