>>>>> "IS" == Ivan Shmakov <ivan@xxxxxxxxxxxxxx> writes: IS> GPT contains a supposed to be unique “Disk GUID” field, which IS> allows for the media bearing such a partition table to be IS> identified. IS> May I suggest adding support for GPT to libblkid? An alpha-quality IS> patch is MIME'd. Ahem. Wrong copy-paste late at night. Should be better this time. For a test: $ blkid -t TYPE=gpt /dev/sd? /dev/sdb: UUID="CE050C6F-E7BE-AD46-8FEE-F02476EC767E" TYPE="gpt" /dev/sdd: UUID="2A1210B5-535F-4A4A-84D0-34ABC6E57FFB" TYPE="gpt" /dev/sde: UUID="7B0FA8C6-26DD-1840-BBF5-46AD26CA551C" TYPE="gpt" /dev/sdf: UUID="04DF9DE5-CFDA-514D-99B7-CC61061FCE3C" TYPE="gpt" $ Please note that the CRC-32 value contained in the GPT is not checked. The UUID could be printed in lower case instead. -- FSF associate member #7257
diff --git a/lib/blkid/probe.c b/lib/blkid/probe.c index 6b75732..8500320 100644 --- a/lib/blkid/probe.c +++ b/lib/blkid/probe.c @@ -1383,6 +1383,33 @@ static int probe_btrfs(struct blkid_probe *probe, set_uuid(probe->dev, bs->fsid, 0); return 0; } + +static int probe_gpt (struct blkid_probe *probe, + struct blkid_magic *id, + unsigned char *buf) +{ + struct gpt_header *gh + = (struct gpt_header *)(buf + 0x200); + + /* FIXME: check gh->header_crc32 */ + + { + const __u8 *u = gh->disk_guid; + char uuid_str[33]; + + sprintf (uuid_str, + ("%02X%02X%02X%02X" + "-%02X%02X-%02X%02X-%02X%02X" + "-%02X%02X%02X%02X%02X%02X"), + u[0], u[1], u[2], u[3], + u[4], u[5], u[6], u[7], u[8], u[9], + u[10], u[11], u[12], u[13], u[14], u[15]); + blkid_set_tag (probe->dev, "UUID", uuid_str, 0); + } + + return 0; +} + /* * Various filesystem magics that we can check for. Note that kboff and * sboff are in kilobytes and bytes respectively. All magics are in @@ -1482,6 +1509,7 @@ static struct blkid_magic type_array[] = { { "lvm2pv", 1, 0x018, 8, "LVM2 001", probe_lvm2 }, { "lvm2pv", 1, 0x218, 8, "LVM2 001", probe_lvm2 }, { "btrfs", 64, 0x40, 8, "_BHRfS_M", probe_btrfs }, + { "gpt", 0, 0x200, 8, "EFI PART", probe_gpt }, { NULL, 0, 0, 0, NULL, NULL } }; diff --git a/lib/blkid/probe.h b/lib/blkid/probe.h index 37fc9c0..4d39b84 100644 --- a/lib/blkid/probe.h +++ b/lib/blkid/probe.h @@ -725,6 +725,28 @@ struct btrfs_super_block { __u8 sys_chunk_array[BTRFS_SYSTEM_CHUNK_ARRAY_SIZE]; } __attribute__ ((__packed__)); +struct gpt_header { + /* references: + * * linux/include/linux/efi.h; + * * Wikipedia entry. + */ + __u64 signature; + __u32 revision; + __u32 header_size; + __u32 header_crc32; + __u32 reserved1; + __u64 my_lba; + __u64 alternate_lba; + __u64 first_usable_lba; + __u64 last_usable_lba; + __u8 disk_guid[16]; + __u64 partition_entry_lba; + __u32 num_partition_entries; + __u32 sizeof_partition_entry; + __u32 partition_entry_array_crc32; + __u8 reserved2[512 - 92]; +} __attribute__ ((__packed__)); + /* * Byte swap functions */
Attachment:
pgpTJ4gkNChg2.pgp
Description: PGP signature