diff options
| -rw-r--r-- | common/cmd_nvedit.c | 33 | ||||
| -rw-r--r-- | common/env_dataflash.c | 2 | ||||
| -rw-r--r-- | common/env_eeprom.c | 2 | ||||
| -rw-r--r-- | common/env_flash.c | 4 | ||||
| -rw-r--r-- | common/env_mmc.c | 2 | ||||
| -rw-r--r-- | common/env_nand.c | 4 | ||||
| -rw-r--r-- | common/env_nvram.c | 2 | ||||
| -rw-r--r-- | common/env_onenand.c | 2 | ||||
| -rw-r--r-- | common/env_sf.c | 4 | ||||
| -rw-r--r-- | include/search.h | 3 | ||||
| -rw-r--r-- | lib/hashtable.c | 15 | 
11 files changed, 47 insertions, 26 deletions
| diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 396a17135..7194ade80 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -125,7 +125,7 @@ static int env_print(char *name)  	}  	/* print whole list */ -	len = hexport_r(&env_htab, '\n', &res, 0); +	len = hexport_r(&env_htab, '\n', &res, 0, 0, NULL);  	if (len > 0) {  		puts(res); @@ -647,7 +647,7 @@ static int do_env_delete(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv  #ifdef CONFIG_CMD_EXPORTENV  /* - * env export [-t | -b | -c] addr [size] + * env export [-t | -b | -c] [-s size] addr [var ...]   *	-t:	export as text format; if size is given, data will be   *		padded with '\0' bytes; if not, one terminating '\0'   *		will be added (which is included in the "filesize" @@ -657,8 +657,12 @@ static int do_env_delete(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv   *		'\0', list end marked by double "\0\0")   *	-c:	export as checksum protected environment format as   *		used for example by "saveenv" command + *	-s size: + *		size of output buffer   *	addr:	memory address where environment gets stored - *	size:	size of output buffer + *	var...	List of variable names that get included into the + *		export. Without arguments, the whole environment gets + *		exported.   *   * With "-c" and size is NOT given, then the export command will   * format the data as currently used for the persistent storage, @@ -691,7 +695,7 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv  {  	char	buf[32];  	char	*addr, *cmd, *res; -	size_t	size; +	size_t	size = 0;  	ssize_t	len;  	env_t	*envp;  	char	sep = '\n'; @@ -715,6 +719,11 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv  				sep = '\0';  				chk = 1;  				break; +			case 's':		/* size given */ +				if (--argc <= 0) +					return cmd_usage(cmdtp); +				size = simple_strtoul(*++argv, NULL, 16); +				goto NXTARG;  			case 't':		/* text format */  				if (fmt++)  					goto sep_err; @@ -724,6 +733,7 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv  				return cmd_usage(cmdtp);  			}  		} +NXTARG:		;  	}  	if (argc < 1) @@ -731,15 +741,14 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv  	addr = (char *)simple_strtoul(argv[0], NULL, 16); -	if (argc == 2) { -		size = simple_strtoul(argv[1], NULL, 16); +	if (size)  		memset(addr, '\0', size); -	} else { -		size = 0; -	} + +	argc--; +	argv++;  	if (sep) {		/* export as text file */ -		len = hexport_r(&env_htab, sep, &addr, size); +		len = hexport_r(&env_htab, sep, &addr, size, argc, argv);  		if (len < 0) {  			error("Cannot export environment: errno = %d\n",  				errno); @@ -758,7 +767,7 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv  	else			/* export as raw binary data */  		res = addr; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, argc, argv);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n",  			errno); @@ -965,7 +974,7 @@ U_BOOT_CMD(  #if defined(CONFIG_CMD_EDITENV)  	"env edit name - edit environment variable\n"  #endif -	"env export [-t | -b | -c] addr [size] - export environment\n" +	"env export [-t | -b | -c] [-s size] addr [var ...] - export environment\n"  #if defined(CONFIG_CMD_GREPENV)  	"env grep string [...] - search environment\n"  #endif diff --git a/common/env_dataflash.c b/common/env_dataflash.c index 1d5707902..0c4c676e1 100644 --- a/common/env_dataflash.c +++ b/common/env_dataflash.c @@ -68,7 +68,7 @@ int saveenv(void)  	char	*res;  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		return 1; diff --git a/common/env_eeprom.c b/common/env_eeprom.c index 0a179ad3d..1233b1aa3 100644 --- a/common/env_eeprom.c +++ b/common/env_eeprom.c @@ -143,7 +143,7 @@ int saveenv(void)  	BUG_ON(env_ptr != NULL);  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		return 1; diff --git a/common/env_flash.c b/common/env_flash.c index 50ca4ffa5..8e415d72d 100644 --- a/common/env_flash.c +++ b/common/env_flash.c @@ -155,7 +155,7 @@ int saveenv(void)  	}  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		goto done; @@ -289,7 +289,7 @@ int saveenv(void)  		goto done;  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		goto done; diff --git a/common/env_mmc.c b/common/env_mmc.c index 83f40f434..12d647a82 100644 --- a/common/env_mmc.c +++ b/common/env_mmc.c @@ -124,7 +124,7 @@ int saveenv(void)  		return 1;  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		return 1; diff --git a/common/env_nand.c b/common/env_nand.c index 14446a6a5..da4d3b1df 100644 --- a/common/env_nand.c +++ b/common/env_nand.c @@ -200,7 +200,7 @@ int saveenv(void)  		return 1;  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		return 1; @@ -255,7 +255,7 @@ int saveenv(void)  		return 1;  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		return 1; diff --git a/common/env_nvram.c b/common/env_nvram.c index 544ce4711..b108e6e76 100644 --- a/common/env_nvram.c +++ b/common/env_nvram.c @@ -94,7 +94,7 @@ int saveenv(void)  	int	rcode = 0;  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		return 1; diff --git a/common/env_onenand.c b/common/env_onenand.c index 5e04a06cf..414447594 100644 --- a/common/env_onenand.c +++ b/common/env_onenand.c @@ -109,7 +109,7 @@ int saveenv(void)  	};  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		return 1; diff --git a/common/env_sf.c b/common/env_sf.c index d3b36d010..a1ff297ba 100644 --- a/common/env_sf.c +++ b/common/env_sf.c @@ -91,7 +91,7 @@ int saveenv(void)  	}  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		return 1; @@ -293,7 +293,7 @@ int saveenv(void)  	}  	res = (char *)&env_new.data; -	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE); +	len = hexport_r(&env_htab, '\0', &res, ENV_SIZE, 0, NULL);  	if (len < 0) {  		error("Cannot export environment: errno = %d\n", errno);  		goto done; diff --git a/include/search.h b/include/search.h index b4edd4310..ef53edb9f 100644 --- a/include/search.h +++ b/include/search.h @@ -91,7 +91,8 @@ extern int hstrstr_r(const char *__match, int __last_idx, ENTRY ** __retval,  extern int hdelete_r(const char *__key, struct hsearch_data *__htab);  extern ssize_t hexport_r(struct hsearch_data *__htab, -		     const char __sep, char **__resp, size_t __size); +		     const char __sep, char **__resp, size_t __size, +		     int argc, char * const argv[]);  extern int himport_r(struct hsearch_data *__htab,  		     const char *__env, size_t __size, const char __sep, diff --git a/lib/hashtable.c b/lib/hashtable.c index 6895550d3..b7ba3414b 100644 --- a/lib/hashtable.c +++ b/lib/hashtable.c @@ -478,7 +478,8 @@ static int cmpkey(const void *p1, const void *p2)  }  ssize_t hexport_r(struct hsearch_data *htab, const char sep, -		 char **resp, size_t size) +		 char **resp, size_t size, +		 int argc, char * const argv[])  {  	ENTRY *list[htab->size];  	char *res, *p; @@ -502,6 +503,16 @@ ssize_t hexport_r(struct hsearch_data *htab, const char sep,  		if (htab->table[i].used > 0) {  			ENTRY *ep = &htab->table[i].entry; +			int arg, found = 0; + +			for (arg = 0; arg < argc; ++arg) { +				if (strcmp(argv[arg], ep->key) == 0) { +					found = 1; +					break; +				} +			} +			if ((argc > 0) && (found == 0)) +				continue;  			list[n++] = ep; @@ -539,7 +550,7 @@ ssize_t hexport_r(struct hsearch_data *htab, const char sep,  	/* Check if the user supplied buffer size is sufficient */  	if (size) {  		if (size < totlen + 1) {	/* provided buffer too small */ -			debug("### buffer too small: %d, but need %d\n", +			printf("Env export buffer too small: %d, but need %d\n",  				size, totlen + 1);  			__set_errno(ENOMEM);  			return (-1); |