mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-28 09:03:52 +01:00 
			
		
		
		
	cmd: ubi: Add 'ubi list' command for printing list of all UBI volumes
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 <pali@kernel.org>
This commit is contained in:
		
							
								
								
									
										85
									
								
								cmd/ubi.c
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								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); | ||||
| @@ -586,6 +651,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]); | ||||
| @@ -725,6 +805,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" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user