Skip to content

Commit

Permalink
cmd:gpt: randomly generate each partition uuid if undefined
Browse files Browse the repository at this point in the history
Changes:
- randomly generate partition uuid if any is undefined and CONFIG_RAND_UUID
  is defined
- print debug info about set/unset/generated uuid
- update doc/README.gpt

Signed-off-by: Przemyslaw Marczak <[email protected]>
Acked-by: Lukasz Majewski <[email protected]>
Cc: Piotr Wilczek <[email protected]>
Cc: Tom Rini <[email protected]>
Cc: Stephen Warren <[email protected]>
Cc: Lukasz Majewski <[email protected]>
  • Loading branch information
bobenstein authored and trini committed Apr 2, 2014
1 parent 89c8230 commit 3920638
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 22 deletions.
61 changes: 46 additions & 15 deletions common/cmd_gpt.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,30 +29,53 @@
*
* @return - zero on successful expand and env is set
*/
static char extract_env(const char *str, char **env)
static int extract_env(const char *str, char **env)
{
int ret = -1;
char *e, *s;
#ifdef CONFIG_RANDOM_UUID
char uuid_str[UUID_STR_LEN + 1];
#endif

if (!str || strlen(str) < 4)
return -1;

if ((strncmp(str, "${", 2) == 0) && (str[strlen(str) - 1] == '}')) {
s = strdup(str);
if (s == NULL)
return -1;
memset(s + strlen(s) - 1, '\0', 1);
memmove(s, s + 2, strlen(s) - 1);
if (!((strncmp(str, "${", 2) == 0) && (str[strlen(str) - 1] == '}')))
return -1;

s = strdup(str);
if (s == NULL)
return -1;

memset(s + strlen(s) - 1, '\0', 1);
memmove(s, s + 2, strlen(s) - 1);

e = getenv(s);
if (e == NULL) {
#ifdef CONFIG_RANDOM_UUID
debug("%s unset. ", str);
gen_rand_uuid_str(uuid_str, UUID_STR_FORMAT_STD);
setenv(s, uuid_str);

e = getenv(s);
free(s);
if (e == NULL) {
printf("Environmental '%s' not set\n", str);
return -1; /* env not set */
if (e) {
debug("Set to random.\n");
ret = 0;
} else {
debug("Can't get random UUID.\n");
}
*env = e;
return 0;
#else
debug("%s unset.\n", str);
#endif
} else {
debug("%s get from environment.\n", str);
ret = 0;
}

return -1;
*env = e;
free(s);

return ret;
}

/**
Expand Down Expand Up @@ -299,8 +322,16 @@ static int do_gpt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return CMD_RET_FAILURE;
}

if (gpt_default(blk_dev_desc, argv[4]))
puts("Writing GPT: ");

ret = gpt_default(blk_dev_desc, argv[4]);
if (!ret) {
puts("success!\n");
return CMD_RET_SUCCESS;
} else {
puts("error!\n");
return CMD_RET_FAILURE;
}
} else {
return CMD_RET_USAGE;
}
Expand Down
22 changes: 17 additions & 5 deletions doc/README.gpt
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@ of the Primary.
----------------------
Offset Size Description

0 16 B Partition type GUID
16 16 B Unique partition GUID
0 16 B Partition type GUID (Big Endian)
16 16 B Unique partition GUID in (Big Endian)
32 8 B First LBA (Little Endian)
40 8 B Last LBA (inclusive)
48 8 B Attribute flags [+]
Expand All @@ -160,6 +160,9 @@ To restore GUID partition table one needs to:
Fields 'name', 'size' and 'uuid' are mandatory for every partition.
The field 'start' is optional.

option: CONFIG_RANDOM_UUID
If any partition "UUID" no exists then it is randomly generated.

2. Define 'CONFIG_EFI_PARTITION' and 'CONFIG_CMD_GPT'

2. From u-boot prompt type:
Expand All @@ -168,11 +171,20 @@ To restore GUID partition table one needs to:
Useful info:
============

Two programs, namely: 'fdisk' and 'parted' are recommended to work with GPT
recovery. Parted is able to handle GUID partitions. Unfortunately the 'fdisk'
hasn't got such ability.
Two programs, namely: 'gdisk' and 'parted' are recommended to work with GPT
recovery. Both are able to handle GUID partitions.
Please, pay attention at -l switch for parted.

"uuid" program is recommended to generate UUID string. Moreover it can decode
(-d switch) passed in UUID string. It can be used to generate partitions UUID
passed to u-boot environment variables.
If optional CONFIG_RANDOM_UUID is defined then for any partition which environment
uuid is unset, uuid is randomly generated and stored in correspond environment
variable.

note:
Each string block of UUID generated by program "uuid" is in big endian and it is
also stored in big endian in disk GPT.
Partitions layout can be printed by typing "mmc part". Note that each partition
GUID has different byte order than UUID generated before, this is because first
three blocks of GUID string are in Little Endian.
4 changes: 2 additions & 2 deletions lib/uuid.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,5 +251,5 @@ U_BOOT_CMD(guid, CONFIG_SYS_MAXARGS, 1, do_uuid,
"varname: for set result in a environment variable\n"
"e.g. guid guid_env"
);
#endif
#endif
#endif /* CONFIG_CMD_UUID */
#endif /* CONFIG_RANDOM_UUID || CONFIG_CMD_UUID */

0 comments on commit 3920638

Please sign in to comment.