]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - lib/uuid.c
Merge branch 'master' of git://www.denx.de/git/u-boot-imx
[people/ms/u-boot.git] / lib / uuid.c
index 44d0c932ac507c12276616b9e9c0afa19d6728f7..c8584edcb861ad7e15ad207a8a27d83e822be56a 100644 (file)
@@ -4,6 +4,7 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#include <common.h>
 #include <linux/ctype.h>
 #include <errno.h>
 #include <common.h>
@@ -79,10 +80,65 @@ int uuid_str_valid(const char *uuid)
        return 1;
 }
 
+#ifdef CONFIG_PARTITION_TYPE_GUID
+static const struct {
+       const char *string;
+       efi_guid_t guid;
+} list_guid[] = {
+       {"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 string
+ *
+ * @param guid_str - pointer to partition type string
+ * @param guid_bin - pointer to allocated array for big endian output [16B]
+ */
+int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(list_guid); i++) {
+               if (!strcmp(list_guid[i].string, guid_str)) {
+                       memcpy(guid_bin, &list_guid[i].guid, 16);
+                       return 0;
+               }
+       }
+       return -ENODEV;
+}
+
+/*
+ * uuid_guid_get_str() - this function get string for GUID.
+ *
+ * @param guid_bin - pointer to string with partition type guid [16B]
+ * @param guid_str - pointer to allocated partition type string [7B]
+ */
+int uuid_guid_get_str(unsigned char *guid_bin, char *guid_str)
+{
+       int i;
+
+       *guid_str = 0;
+       for (i = 0; i < ARRAY_SIZE(list_guid); i++) {
+               if (!memcmp(list_guid[i].guid.b, guid_bin, 16)) {
+                       strcpy(guid_str, list_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
  */
@@ -92,8 +148,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));
@@ -171,7 +232,7 @@ void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
  *
  * @param uuid_bin - pointer to allocated array [16B]. Output is in big endian.
 */
-#ifdef CONFIG_RANDOM_UUID
+#if defined(CONFIG_RANDOM_UUID) || defined(CONFIG_CMD_UUID)
 void gen_rand_uuid(unsigned char *uuid_bin)
 {
        struct uuid uuid;
@@ -210,4 +271,45 @@ void gen_rand_uuid_str(char *uuid_str, int str_format)
        /* Convert UUID bin to UUID or GUID formated STRING  */
        uuid_bin_to_str(uuid_bin, uuid_str, str_format);
 }
-#endif
+
+#ifdef CONFIG_CMD_UUID
+int do_uuid(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       char uuid[UUID_STR_LEN + 1];
+       int str_format;
+
+       if (!strcmp(argv[0], "uuid"))
+               str_format = UUID_STR_FORMAT_STD;
+       else
+               str_format = UUID_STR_FORMAT_GUID;
+
+       if (argc > 2)
+               return CMD_RET_USAGE;
+
+       gen_rand_uuid_str(uuid, str_format);
+
+       if (argc == 1)
+               printf("%s\n", uuid);
+       else
+               setenv(argv[1], uuid);
+
+       return CMD_RET_SUCCESS;
+}
+
+U_BOOT_CMD(uuid, CONFIG_SYS_MAXARGS, 1, do_uuid,
+          "UUID - generate random Universally Unique Identifier",
+          "[<varname>]\n"
+          "Argument:\n"
+          "varname: for set result in a environment variable\n"
+          "e.g. uuid uuid_env"
+);
+
+U_BOOT_CMD(guid, CONFIG_SYS_MAXARGS, 1, do_uuid,
+          "GUID - generate Globally Unique Identifier based on random UUID",
+          "[<varname>]\n"
+          "Argument:\n"
+          "varname: for set result in a environment variable\n"
+          "e.g. guid guid_env"
+);
+#endif /* CONFIG_CMD_UUID */
+#endif /* CONFIG_RANDOM_UUID || CONFIG_CMD_UUID */