From: Wolfgang Denk Date: Sun, 6 Nov 2011 21:49:44 +0000 (+0100) Subject: env: allow to export only selected variables X-Git-Tag: v2011.12-rc1~226 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=37f2fe7472a34531e7d585eb7e0730b4f8e1f213;p=u-boot env: allow to export only selected variables New syntax: env export [-t | -b | -c] [-s size] addr [var ...] With this change it is possible to provide a list of variables names that shall be exported. Whenno arguments are given, the whole environment gets exported. NOTE: The new handling of the "size" argument means a change to the user API. Signed-off-by: Wolfgang Denk --- diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 396a17135e..7194ade802 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 1d57079027..0c4c676e19 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 0a179ad3d2..1233b1aa39 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 50ca4ffa56..8e415d72d3 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 83f40f4341..12d647a826 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 14446a6a57..da4d3b1df1 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 544ce4711e..b108e6e761 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 5e04a06cf5..414447594f 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 d3b36d0105..a1ff297ba7 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 b4edd43103..ef53edb9fe 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 6895550d3c..b7ba3414b0 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);