mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
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 <wd@denx.de>
This commit is contained in:
parent
5721385b18
commit
37f2fe7472
11 changed files with 47 additions and 26 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue