env: net: U_BOOT_ENV_CALLBACKs should not depend on CMD_NET
[oweals/u-boot.git] / lib / uuid.c
index 5d5adf6b2dfcf90f7794a14fbffd251d712deae0..a48e19c06eafab6c39249f7a005b97298768d6e0 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include <common.h>
+#include <env.h>
 #include <linux/ctype.h>
 #include <errno.h>
 #include <common.h>
@@ -187,9 +188,10 @@ int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format)
 /*
  * 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
+ * @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:                bit 0: 0 - UUID; 1 - GUID
+ *                     bit 1: 0 - lower case; 2 - upper case
  */
 void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
 {
@@ -198,6 +200,7 @@ void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
        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;
+       const char *format;
        int i;
 
        /*
@@ -205,13 +208,17 @@ void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
         * 4B-2B-2B-2B-6B
         * be be be be be
         */
-       if (str_format == UUID_STR_FORMAT_STD)
+       if (str_format & UUID_STR_FORMAT_GUID)
+               char_order = guid_char_order;
+       else
                char_order = uuid_char_order;
+       if (str_format & UUID_STR_UPPER_CASE)
+               format = "%02X";
        else
-               char_order = guid_char_order;
+               format = "%02x";
 
        for (i = 0; i < 16; i++) {
-               sprintf(uuid_str, "%02x", uuid_bin[char_order[i]]);
+               sprintf(uuid_str, format, uuid_bin[char_order[i]]);
                uuid_str += 2;
                switch (i) {
                case 3:
@@ -234,23 +241,25 @@ void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
 #if defined(CONFIG_RANDOM_UUID) || defined(CONFIG_CMD_UUID)
 void gen_rand_uuid(unsigned char *uuid_bin)
 {
-       struct uuid uuid;
-       unsigned int *ptr = (unsigned int *)&uuid;
+       u32 ptr[4];
+       struct uuid *uuid = (struct uuid *)ptr;
        int i;
 
+       srand(get_ticks() + rand());
+
        /* Set all fields randomly */
-       for (i = 0; i < sizeof(struct uuid) / sizeof(*ptr); i++)
-               *(ptr + i) = cpu_to_be32(rand());
+       for (i = 0; i < 4; i++)
+               ptr[i] = rand();
 
-       clrsetbits_be16(&uuid.time_hi_and_version,
+       clrsetbits_be16(&uuid->time_hi_and_version,
                        UUID_VERSION_MASK,
                        UUID_VERSION << UUID_VERSION_SHIFT);
 
-       clrsetbits_8(&uuid.clock_seq_hi_and_reserved,
+       clrsetbits_8(&uuid->clock_seq_hi_and_reserved,
                     UUID_VARIANT_MASK,
                     UUID_VARIANT << UUID_VARIANT_SHIFT);
 
-       memcpy(uuid_bin, &uuid, sizeof(struct uuid));
+       memcpy(uuid_bin, uuid, 16);
 }
 
 /*
@@ -271,7 +280,7 @@ void gen_rand_uuid_str(char *uuid_str, int str_format)
        uuid_bin_to_str(uuid_bin, uuid_str, str_format);
 }
 
-#ifdef CONFIG_CMD_UUID
+#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_CMD_UUID)
 int do_uuid(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        char uuid[UUID_STR_LEN + 1];