[U-Boot] [PATCH 3/3] uuid: add shorcut for known GUID

guid shorcut can be used in gpt command with guid parameter partitions = name=boot,size=0x6bc00,guid=data; \ name=root,size=0x7538ba00,guid=linux; gpt write mmc 0 $partitions
and they are used to display the type of partition in "part list" command
Partition Map for MMC device 0 -- Partition Type: EFI
Part Start LBA End LBA Name Attributes Type GUID Partition GUID 1 0x00000022 0x0000037f "boot" attrs: 0x0000000000000000 type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 type: data guid: d117f98e-6f2c-d04b-a5b2-331a19f91cb2 2 0x00000380 0x003a9fdc "root" attrs: 0x0000000000000000 type: 0fc63daf-8483-4772-8e79-3d69d8477de4 type: linux guid: 25718777-d0ad-7443-9e60-02cb591c9737
Signed-off-by: Patrick Delaunay patrick.delaunay73@gmail.com ---
disk/part_efi.c | 4 ++++ include/uuid.h | 4 ++++ lib/uuid.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/disk/part_efi.c b/disk/part_efi.c index 25bf8f9..9118be0 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -223,6 +223,10 @@ void print_part_efi(block_dev_desc_t * dev_desc) uuid_bin = (unsigned char *)gpt_pte[i].partition_type_guid.b; uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID); printf("\ttype:\t%s\n", uuid); +#ifdef CONFIG_PARTITION_TYPE_GUID + if (!uuid_guid_get_str(uuid_bin, uuid)) + printf("\ttype:\t%s\n", uuid); +#endif uuid_bin = (unsigned char *)gpt_pte[i].unique_partition_guid.b; uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID); printf("\tguid:\t%s\n", uuid); diff --git a/include/uuid.h b/include/uuid.h index 93027c1..15a14cd 100644 --- a/include/uuid.h +++ b/include/uuid.h @@ -36,6 +36,10 @@ enum { int uuid_str_valid(const char *uuid); int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format); void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format); +#ifdef CONFIG_PARTITION_TYPE_GUID +int uuid_guid_get_bin(char *uuid_str, unsigned char *uuid_bin); +int uuid_guid_get_str(unsigned char *uuid_bin, char *uuid_str); +#endif void gen_rand_uuid(unsigned char *uuid_bin); void gen_rand_uuid_str(char *uuid_str, int str_format); #endif diff --git a/lib/uuid.c b/lib/uuid.c index f6b4423..9805aa0 100644 --- a/lib/uuid.c +++ b/lib/uuid.c @@ -80,10 +80,63 @@ int uuid_str_valid(const char *uuid) return 1; }
+#ifdef CONFIG_PARTITION_TYPE_GUID +const struct { + char *string; + efi_guid_t guid; +} shorcut_guid[8] = { + {"system", PARTITION_SYSTEM_GUID}, + {"mbr", LEGACY_MBR_PARTITION_GUID}, + {"msft", PARTITION_MSFT_RESERVED_GUID}, + {"data", PARTITION_BASIC_DATA_GUID}, + {"linux", PARTITION_LINUX_FILE_SYSTEM_DATA_GUID}, + {"raid", PARTITION_LINUX_RAID_GUID}, + {"swap", PARTITION_LINUX_SWAP_GUID}, + {"lvm", PARTITION_LINUX_LVM_GUID} +}; + +/* + * uuid_guid_get_bin() - this function get GUID bin for GUID shorcut string + * + * @param uuid_str - pointer to allocated array [7B] + * @param uuid_bin - pointer to allocated array for big endian output [16B] + */ +int uuid_guid_get_bin(char *uuid_str, unsigned char *uuid_bin) +{ + int i; + for (i = 0; i < 8; i++) { + if (!strcmp(shorcut_guid[i].string, uuid_str)) { + memcpy(uuid_bin, &shorcut_guid[i].guid, 16); + return 0; + } + } + return -ENODEV; +} + +/* + * uuid_guid_get_str() - this function get GUID shortcut string for GUID. + * + * @param uuid_bin - pointer to allocated array for big endian output [16B] + * @param uuid_str - pointer to allocated array [7B] + */ +int uuid_guid_get_str(unsigned char *uuid_bin, char *uuid_str) +{ + int i; + *uuid_str = 0; + for (i = 0; i < 8; i++) { + if (!memcmp(shorcut_guid[i].guid.b, uuid_bin, 16)) { + strcpy(uuid_str, shorcut_guid[i].string); + return 0; + } + } + return -ENODEV; +} +#endif + /* * uuid_str_to_bin() - convert string UUID or GUID to big endian binary data. * - * @param uuid_str - pointer to UUID or GUID string [37B] + * @param uuid_str - pointer to UUID or GUID string [37B] or GUID shorcut * @param uuid_bin - pointer to allocated array for big endian output [16B] * @str_format - UUID string format: 0 - UUID; 1 - GUID */ @@ -93,8 +146,13 @@ int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format) uint32_t tmp32; uint64_t tmp64;
- if (!uuid_str_valid(uuid_str)) + if (!uuid_str_valid(uuid_str)) { +#ifdef CONFIG_PARTITION_TYPE_GUID + if (!uuid_guid_get_bin(uuid_str, uuid_bin)) + return 0; +#endif return -EINVAL; + }
if (str_format == UUID_STR_FORMAT_STD) { tmp32 = cpu_to_be32(simple_strtoul(uuid_str, NULL, 16));
participants (1)
-
Patrick Delaunay