PING?

On Monday 12 September 2022 11:38:55 Pali Rohár wrote:
> To allow easily iterate over all UBI volumes, add a new command which
> either print all user UBI volumes on output or set them into env variable.
> 
> As UBI volumes can have arbitrary name/label, in most cases it is useful to
> iterate them by their numbers. This can be achieved by -numeric flag.
> 
> This functionality is similar to already existing 'part list' command which
> prints partitions on formatted block device.
> 
> Signed-off-by: Pali Rohár <p...@kernel.org>
> ---
>  cmd/ubi.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 85 insertions(+)
> 
> diff --git a/cmd/ubi.c b/cmd/ubi.c
> index fe8ac58bac08..2a32575a257c 100644
> --- a/cmd/ubi.c
> +++ b/cmd/ubi.c
> @@ -27,6 +27,7 @@
>  #include <ubi_uboot.h>
>  #include <linux/errno.h>
>  #include <jffs2/load_kernel.h>
> +#include <linux/log2.h>
>  
>  #undef ubi_msg
>  #define ubi_msg(fmt, ...) printf("UBI: " fmt "\n", ##__VA_ARGS__)
> @@ -84,6 +85,70 @@ static int ubi_info(int layout)
>       return 0;
>  }
>  
> +static int ubi_list(const char *var, int numeric)
> +{
> +     size_t namelen, len, size;
> +     char *str, *str2;
> +     int i;
> +
> +     if (!var) {
> +             for (i = 0; i < (ubi->vtbl_slots + 1); i++) {
> +                     if (!ubi->volumes[i])
> +                             continue;
> +                     if (ubi->volumes[i]->vol_id >= UBI_INTERNAL_VOL_START)
> +                             continue;
> +                     printf("%d: %s\n",
> +                            ubi->volumes[i]->vol_id,
> +                            ubi->volumes[i]->name);
> +             }
> +             return 0;
> +     }
> +
> +     len = 0;
> +     size = 16;
> +     str = malloc(size);
> +     if (!str)
> +             return 1;
> +
> +     for (i = 0; i < (ubi->vtbl_slots + 1); i++) {
> +             if (!ubi->volumes[i])
> +                     continue;
> +             if (ubi->volumes[i]->vol_id >= UBI_INTERNAL_VOL_START)
> +                     continue;
> +
> +             if (numeric)
> +                     namelen = 10; /* strlen(stringify(INT_MAX)) */
> +             else
> +                     namelen = strlen(ubi->volumes[i]->name);
> +
> +             if (len + namelen + 1 > size) {
> +                     size = roundup_pow_of_two(len + namelen + 1) * 2;
> +                     str2 = realloc(str, size);
> +                     if (!str2) {
> +                             free(str);
> +                             return 1;
> +                     }
> +                     str = str2;
> +             }
> +
> +             if (len)
> +                     str[len++] = ' ';
> +
> +             if (numeric) {
> +                     len += sprintf(str + len, "%d", 
> ubi->volumes[i]->vol_id) + 1;
> +             } else {
> +                     memcpy(str + len, ubi->volumes[i]->name, namelen);
> +                     len += namelen;
> +                     str[len] = 0;
> +             }
> +     }
> +
> +     env_set(var, str);
> +     free(str);
> +
> +     return 0;
> +}
> +
>  static int ubi_check_volumename(const struct ubi_volume *vol, char *name)
>  {
>       return strcmp(vol->name, name);
> @@ -581,6 +646,21 @@ static int do_ubi(struct cmd_tbl *cmdtp, int flag, int 
> argc, char *const argv[])
>               return ubi_info(layout);
>       }
>  
> +     if (strcmp(argv[1], "list") == 0) {
> +             int numeric = 0;
> +             if (argc >= 2 && argv[2][0] == '-') {
> +                     if (strcmp(argv[2], "-numeric") == 0)
> +                             numeric = 1;
> +                     else
> +                             return CMD_RET_USAGE;
> +             }
> +             if (!numeric && argc != 2 && argc != 3)
> +                     return CMD_RET_USAGE;
> +             if (numeric && argc != 3 && argc != 4)
> +                     return CMD_RET_USAGE;
> +             return ubi_list(argv[numeric ? 3 : 2], numeric);
> +     }
> +
>       if (strcmp(argv[1], "check") == 0) {
>               if (argc > 2)
>                       return ubi_check(argv[2]);
> @@ -720,6 +800,11 @@ U_BOOT_CMD(
>               " header offset)\n"
>       "ubi info [l[ayout]]"
>               " - Display volume and ubi layout information\n"
> +     "ubi list [flags]"
> +             " - print the list of volumes\n"
> +     "ubi list [flags] <varname>"
> +             " - set environment variable to the list of volumes"
> +             " (flags can be -numeric)\n"
>       "ubi check volumename"
>               " - check if volumename exists\n"
>       "ubi create[vol] volume [size] [type] [id] [--skipcheck]\n"
> -- 
> 2.20.1
> 

Reply via email to