lib: uuid: code refactor for proper maintain between uuid bin and string
authorPrzemyslaw Marczak <p.marczak@samsung.com>
Wed, 2 Apr 2014 08:20:03 +0000 (10:20 +0200)
committerChanho Park <chanho61.park@samsung.com>
Fri, 24 Jul 2015 07:29:47 +0000 (16:29 +0900)
Changes in lib/uuid.c to:
- uuid_str_to_bin()
- uuid_bin_to_str()

New parameter is added to specify input/output string format in listed functions
This change allows easy recognize which UUID type is or should be stored in given
string array. Binary data of UUID and GUID is always stored in big endian, only
string representations are different as follows.

String byte: 0                                  36
String char: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
string UUID:    be     be   be   be       be
string GUID:    le     le   le   be       be

This patch also updates functions calls and declarations in a whole code.

Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com>
Cc: Stephen Warren <swarren@nvidia.com>
Cc: Lukasz Majewski <l.majewski@samsung.com>
Cc: trini@ti.com
disk/part_efi.c
include/common.h
include/uuid.h [new file with mode: 0644]
lib/uuid.c
net/bootp.c

index 32b054d7529a00360c29e7251a0ade37bdd469a1..043a840aedbc3563e91abceaefc2edb2301f1e2d 100644 (file)
@@ -116,8 +116,8 @@ void print_part_efi(block_dev_desc_t * dev_desc)
 
        printf("Part\tStart LBA\tEnd LBA\t\tName\n");
        printf("\tAttributes\n");
-       printf("\tType UUID\n");
-       printf("\tPartition UUID\n");
+       printf("\tType GUID\n");
+       printf("\tPartition GUID\n");
 
        for (i = 0; i < le32_to_cpu(gpt_head->num_partition_entries); i++) {
                /* Stop at the first non valid PTE */
@@ -130,11 +130,11 @@ void print_part_efi(block_dev_desc_t * dev_desc)
                        print_efiname(&gpt_pte[i]));
                printf("\tattrs:\t0x%016llx\n", gpt_pte[i].attributes.raw);
                uuid_bin = (unsigned char *)gpt_pte[i].partition_type_guid.b;
-               uuid_bin_to_str(uuid_bin, uuid);
+               uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
                printf("\ttype:\t%s\n", uuid);
                uuid_bin = (unsigned char *)gpt_pte[i].unique_partition_guid.b;
-               uuid_bin_to_str(uuid_bin, uuid);
-               printf("\tuuid:\t%s\n", uuid);
+               uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
+               printf("\tguid:\t%s\n", uuid);
        }
 
        /* Remember to free pte */
@@ -181,7 +181,8 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
        sprintf((char *)info->type, "U-Boot");
        info->bootable = is_bootable(&gpt_pte[part - 1]);
 #ifdef CONFIG_PARTITION_UUIDS
-       uuid_bin_to_str(gpt_pte[part - 1].unique_partition_guid.b, info->uuid);
+       uuid_bin_to_str(gpt_pte[part - 1].unique_partition_guid.b, info->uuid,
+                       UUID_STR_FORMAT_GUID);
 #endif
 
        debug("%s: start 0x%lX, size 0x%lX, name %s", __func__,
@@ -342,7 +343,7 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
                str_uuid = partitions[i].uuid;
                bin_uuid = gpt_e[i].unique_partition_guid.b;
 
-               if (uuid_str_to_bin(str_uuid, bin_uuid)) {
+               if (uuid_str_to_bin(str_uuid, bin_uuid, UUID_STR_FORMAT_STD)) {
                        printf("Partition no. %d: invalid guid: %s\n",
                                i, str_uuid);
                        return -1;
@@ -389,7 +390,7 @@ int gpt_fill_header(block_dev_desc_t *dev_desc, gpt_header *gpt_h,
        gpt_h->header_crc32 = 0;
        gpt_h->partition_entry_array_crc32 = 0;
 
-       if (uuid_str_to_bin(str_guid, gpt_h->disk_guid.b))
+       if (uuid_str_to_bin(str_guid, gpt_h->disk_guid.b, UUID_STR_FORMAT_GUID))
                return -1;
 
        return 0;
index f8236d1cbca2bfd0c66f37bebd6dd3a082914b4d..c89923cb4024d3ee9cde1ea900b4406861eb5b9d 100644 (file)
@@ -756,9 +756,7 @@ void        udelay        (unsigned long);
 void mdelay(unsigned long);
 
 /* lib/uuid.c */
-void uuid_bin_to_str(unsigned char *uuid, char *str);
-int uuid_str_to_bin(char *uuid, unsigned char *out);
-int uuid_str_valid(const char *uuid);
+#include <uuid.h>
 
 /* lib/vsprintf.c */
 #include <vsprintf.h>
diff --git a/include/uuid.h b/include/uuid.h
new file mode 100644 (file)
index 0000000..e8feeed
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2014 Samsung Electronics
+ * Przemyslaw Marczak <p.marczak@samsung.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#ifndef __UUID_H__
+#define __UUID_H__
+
+enum {
+       UUID_STR_FORMAT_STD,
+       UUID_STR_FORMAT_GUID
+};
+
+#define UUID_STR_LEN           36
+#define UUID_BIN_LEN           16
+
+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);
+#endif
index a788865ae2083aa2c435cf3b039784f24dc53b44..adbc9d692bfd3188c28e161ec26f5a98cf25f701 100644 (file)
@@ -23,8 +23,9 @@
 #include <linux/ctype.h>
 #include <errno.h>
 #include <common.h>
-
-#define UUID_STR_LEN           36
+#include <asm/io.h>
+#include <part_efi.h>
+#include <malloc.h>
 
 /*
  * UUID - Universally Unique IDentifier - 128 bits unique number.
@@ -56,7 +57,6 @@
  *
  * GUID is used e.g. in GPT (GUID Partition Table) as a partiions unique id.
  */
-
 int uuid_str_valid(const char *uuid)
 {
        int i, valid;
@@ -75,57 +75,92 @@ int uuid_str_valid(const char *uuid)
                }
        }
 
-       if (i != 36 || !valid)
+       if (i != UUID_STR_LEN || !valid)
                return 0;
 
        return 1;
 }
 
-int uuid_str_to_bin(char *uuid, unsigned char *out)
+/*
+ * 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_bin - pointer to allocated array for big endian output [16B]
+ * @str_format     - UUID string format: 0 - UUID; 1 - GUID
+ */
+int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format)
 {
        uint16_t tmp16;
        uint32_t tmp32;
        uint64_t tmp64;
 
-       if (!uuid || !out)
+       if (!uuid_str_valid(uuid_str))
                return -EINVAL;
 
-       if (strlen(uuid) != UUID_STR_LEN)
-               return -EINVAL;
+       if (str_format == UUID_STR_FORMAT_STD) {
+               tmp32 = cpu_to_be32(simple_strtoul(uuid_str, NULL, 16));
+               memcpy(uuid_bin, &tmp32, 4);
 
-       tmp32 = cpu_to_le32(simple_strtoul(uuid, NULL, 16));
-       memcpy(out, &tmp32, 4);
+               tmp16 = cpu_to_be16(simple_strtoul(uuid_str + 9, NULL, 16));
+               memcpy(uuid_bin + 4, &tmp16, 2);
 
-       tmp16 = cpu_to_le16(simple_strtoul(uuid + 9, NULL, 16));
-       memcpy(out + 4, &tmp16, 2);
+               tmp16 = cpu_to_be16(simple_strtoul(uuid_str + 14, NULL, 16));
+               memcpy(uuid_bin + 6, &tmp16, 2);
+       } else {
+               tmp32 = cpu_to_le32(simple_strtoul(uuid_str, NULL, 16));
+               memcpy(uuid_bin, &tmp32, 4);
 
-       tmp16 = cpu_to_le16(simple_strtoul(uuid + 14, NULL, 16));
-       memcpy(out + 6, &tmp16, 2);
+               tmp16 = cpu_to_le16(simple_strtoul(uuid_str + 9, NULL, 16));
+               memcpy(uuid_bin + 4, &tmp16, 2);
 
-       tmp16 = cpu_to_be16(simple_strtoul(uuid + 19, NULL, 16));
-       memcpy(out + 8, &tmp16, 2);
+               tmp16 = cpu_to_le16(simple_strtoul(uuid_str + 14, NULL, 16));
+               memcpy(uuid_bin + 6, &tmp16, 2);
+       }
+
+       tmp16 = cpu_to_be16(simple_strtoul(uuid_str + 19, NULL, 16));
+       memcpy(uuid_bin + 8, &tmp16, 2);
 
-       tmp64 = cpu_to_be64(simple_strtoull(uuid + 24, NULL, 16));
-       memcpy(out + 10, (char *)&tmp64 + 2, 6);
+       tmp64 = cpu_to_be64(simple_strtoull(uuid_str + 24, NULL, 16));
+       memcpy(uuid_bin + 10, (char *)&tmp64 + 2, 6);
 
        return 0;
 }
 
-void uuid_bin_to_str(unsigned char *uuid, char *str)
+/*
+ * uuid_bin_to_str() - convert big endian binary data to string UUID or GUID.
+ *
+ * @param uuid_bin - pointer to binary data of UUID (big endian) [16B]
+ * @param uuid_str - pointer to allocated array for output string [37B]
+ * @str_format     - UUID string format: 0 - UUID; 1 - GUID
+ */
+void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
 {
-       static const u8 le[16] = {3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11,
-                                 12, 13, 14, 15};
+       const u8 uuid_char_order[UUID_BIN_LEN] = {0, 1, 2, 3, 4, 5, 6, 7, 8,
+                                                 9, 10, 11, 12, 13, 14, 15};
+       const u8 guid_char_order[UUID_BIN_LEN] = {3, 2, 1, 0, 5, 4, 7, 6, 8,
+                                                 9, 10, 11, 12, 13, 14, 15};
+       const u8 *char_order;
        int i;
 
+       /*
+        * UUID and GUID bin data - always in big endian:
+        * 4B-2B-2B-2B-6B
+        * be be be be be
+        */
+       if (str_format == UUID_STR_FORMAT_STD)
+               char_order = uuid_char_order;
+       else
+               char_order = guid_char_order;
+
        for (i = 0; i < 16; i++) {
-               sprintf(str, "%02x", uuid[le[i]]);
-               str += 2;
+               sprintf(uuid_str, "%02x", uuid_bin[char_order[i]]);
+               uuid_str += 2;
                switch (i) {
                case 3:
                case 5:
                case 7:
                case 9:
-                       *str++ = '-';
+                       *uuid_str++ = '-';
                        break;
                }
        }
index c9b8349b3650b873351dd44b86eb4386a495e285..0f0d1d7e582a445be1e2ac54a2b660eb29222a57 100644 (file)
@@ -431,7 +431,7 @@ static int DhcpExtended(u8 *e, int message_type, IPaddr_t ServerID,
                        *e++ = 17;
                        *e++ = 0;       /* type 0 - UUID */
 
-                       uuid_str_to_bin(uuid, e);
+                       uuid_str_to_bin(uuid, e, UUID_STR_FORMAT_STD);
                        e += 16;
                } else {
                        printf("Invalid pxeuuid: %s\n", uuid);