[PATCH] cmd: gpt: Add option to write GPT partitions to environment variable
Heinrich Schuchardt
xypron.glpk at gmx.de
Thu Feb 25 21:03:14 CET 2021
On 2/25/21 7:56 PM, Farhan Ali wrote:
> This change would enhance the existing 'gpt read' command to allow
> (optionally) writing of the read GPT partitions to an environment
> variable. This would allow users to easily change the partition
> settings and then simply reuse the variable in the 'gpt write' and
> 'gpt verify' commands.
>
> Signed-off-by: Farhan Ali <farhan.ali at broadcom.com>
Hello Farhan,
It is unclear what your use case is.
'gpt read' already reads the data into a data structure for
manipulation. See doc/README.gpt.
Please, provide an example showing how you will use the variable.
> ---
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
> Cc: Corneliu Doban <cdoban at broadcom.com>
> Cc: Rayagonda Kokatanur <rayagonda.kokatanur at broadcom.com>
>
> cmd/gpt.c | 46 ++++++++++++++++++++++++++++++++++++++--------
> 1 file changed, 38 insertions(+), 8 deletions(-)
>
> diff --git a/cmd/gpt.c b/cmd/gpt.c
> index 76a95ad..12d0551 100644
> --- a/cmd/gpt.c
> +++ b/cmd/gpt.c
> @@ -350,17 +350,46 @@ static int get_gpt_info(struct blk_desc *dev_desc)
> }
>
> /* a wrapper to test get_gpt_info */
> -static int do_get_gpt_info(struct blk_desc *dev_desc)
> +static int do_get_gpt_info(struct blk_desc *dev_desc, char * const namestr)
> {
> - int ret;
> + int numparts;
> +
> + numparts = get_gpt_info(dev_desc);
> +
> + if (numparts > 0) {
> + if (namestr) {
If the parameter is missing, the caller passes random bytes and not
NULL. So this check does not work.
> + char disk_guid[UUID_STR_LEN + 1];
> + char *partitions_list;
> + int partlistlen;
> + int ret = -1;
> +
> + ret = get_disk_guid(dev_desc, disk_guid);
> + if (ret < 0)
> + return ret;
> +
> + partlistlen = calc_parts_list_len(numparts);
> + partitions_list = malloc(partlistlen);
> + if (!partitions_list) {
> + del_gpt_info();
> + return -ENOMEM;
> + }
> + memset(partitions_list, '\0', partlistlen);
> +
> + ret = create_gpt_partitions_list(numparts, disk_guid,
> + partitions_list);
> + if (ret < 0)
> + printf("Error: Could not create partition list string!\n");
> + else
> + env_set(namestr, partitions_list);
>
> - ret = get_gpt_info(dev_desc);
> - if (ret > 0) {
> - print_gpt_info();
> + free(partitions_list);
> + } else {
> + print_gpt_info();
> + }
> del_gpt_info();
> return 0;
> }
> - return ret;
> + return numparts;
> }
> #endif
>
> @@ -982,7 +1011,7 @@ static int do_gpt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
> ret = do_disk_guid(blk_dev_desc, argv[4]);
> #ifdef CONFIG_CMD_GPT_RENAME
> } else if (strcmp(argv[1], "read") == 0) {
> - ret = do_get_gpt_info(blk_dev_desc);
> + ret = do_get_gpt_info(blk_dev_desc, argv[4]);
You have to check argc to know if argv[4] exists and pass argv[4] or
NULL accordingly.
> } else if ((strcmp(argv[1], "swap") == 0) ||
> (strcmp(argv[1], "rename") == 0)) {
> ret = do_rename_gpt_parts(blk_dev_desc, argv[1], argv[4], argv[5]);
> @@ -1028,8 +1057,9 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
> " gpt guid mmc 0 varname\n"
> #ifdef CONFIG_CMD_GPT_RENAME
> "gpt partition renaming commands:\n"
> - " gpt read <interface> <dev>\n"
> + " gpt read <interface> <dev> [<varname>]\n"
> " - read GPT into a data structure for manipulation\n"
> + " - read GPT partitions into environment variable\n"
Where is your update for doc/README.gpt?
Best regards
Heinrich
> " gpt swap <interface> <dev> <name1> <name2>\n"
> " - change all partitions named name1 to name2\n"
> " and vice-versa\n"
>
More information about the U-Boot
mailing list