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
@ -125,7 +125,7 @@ static int env_print(char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* print whole list */
|
/* print whole list */
|
||||||
len = hexport_r(&env_htab, '\n', &res, 0);
|
len = hexport_r(&env_htab, '\n', &res, 0, 0, NULL);
|
||||||
|
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
puts(res);
|
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
|
#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
|
* -t: export as text format; if size is given, data will be
|
||||||
* padded with '\0' bytes; if not, one terminating '\0'
|
* padded with '\0' bytes; if not, one terminating '\0'
|
||||||
* will be added (which is included in the "filesize"
|
* 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")
|
* '\0', list end marked by double "\0\0")
|
||||||
* -c: export as checksum protected environment format as
|
* -c: export as checksum protected environment format as
|
||||||
* used for example by "saveenv" command
|
* used for example by "saveenv" command
|
||||||
|
* -s size:
|
||||||
|
* size of output buffer
|
||||||
* addr: memory address where environment gets stored
|
* 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
|
* With "-c" and size is NOT given, then the export command will
|
||||||
* format the data as currently used for the persistent storage,
|
* 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 buf[32];
|
||||||
char *addr, *cmd, *res;
|
char *addr, *cmd, *res;
|
||||||
size_t size;
|
size_t size = 0;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
env_t *envp;
|
env_t *envp;
|
||||||
char sep = '\n';
|
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';
|
sep = '\0';
|
||||||
chk = 1;
|
chk = 1;
|
||||||
break;
|
break;
|
||||||
|
case 's': /* size given */
|
||||||
|
if (--argc <= 0)
|
||||||
|
return cmd_usage(cmdtp);
|
||||||
|
size = simple_strtoul(*++argv, NULL, 16);
|
||||||
|
goto NXTARG;
|
||||||
case 't': /* text format */
|
case 't': /* text format */
|
||||||
if (fmt++)
|
if (fmt++)
|
||||||
goto sep_err;
|
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);
|
return cmd_usage(cmdtp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
NXTARG: ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc < 1)
|
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);
|
addr = (char *)simple_strtoul(argv[0], NULL, 16);
|
||||||
|
|
||||||
if (argc == 2) {
|
if (size)
|
||||||
size = simple_strtoul(argv[1], NULL, 16);
|
|
||||||
memset(addr, '\0', size);
|
memset(addr, '\0', size);
|
||||||
} else {
|
|
||||||
size = 0;
|
argc--;
|
||||||
}
|
argv++;
|
||||||
|
|
||||||
if (sep) { /* export as text file */
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n",
|
error("Cannot export environment: errno = %d\n",
|
||||||
errno);
|
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 */
|
else /* export as raw binary data */
|
||||||
res = addr;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n",
|
error("Cannot export environment: errno = %d\n",
|
||||||
errno);
|
errno);
|
||||||
@ -965,7 +974,7 @@ U_BOOT_CMD(
|
|||||||
#if defined(CONFIG_CMD_EDITENV)
|
#if defined(CONFIG_CMD_EDITENV)
|
||||||
"env edit name - edit environment variable\n"
|
"env edit name - edit environment variable\n"
|
||||||
#endif
|
#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)
|
#if defined(CONFIG_CMD_GREPENV)
|
||||||
"env grep string [...] - search environment\n"
|
"env grep string [...] - search environment\n"
|
||||||
#endif
|
#endif
|
||||||
|
@ -68,7 +68,7 @@ int saveenv(void)
|
|||||||
char *res;
|
char *res;
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -143,7 +143,7 @@ int saveenv(void)
|
|||||||
BUG_ON(env_ptr != NULL);
|
BUG_ON(env_ptr != NULL);
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -155,7 +155,7 @@ int saveenv(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
goto done;
|
goto done;
|
||||||
@ -289,7 +289,7 @@ int saveenv(void)
|
|||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -124,7 +124,7 @@ int saveenv(void)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -200,7 +200,7 @@ int saveenv(void)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
@ -255,7 +255,7 @@ int saveenv(void)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -94,7 +94,7 @@ int saveenv(void)
|
|||||||
int rcode = 0;
|
int rcode = 0;
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -109,7 +109,7 @@ int saveenv(void)
|
|||||||
};
|
};
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -91,7 +91,7 @@ int saveenv(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
@ -293,7 +293,7 @@ int saveenv(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
res = (char *)&env_new.data;
|
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) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
goto done;
|
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 int hdelete_r(const char *__key, struct hsearch_data *__htab);
|
||||||
|
|
||||||
extern ssize_t hexport_r(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,
|
extern int himport_r(struct hsearch_data *__htab,
|
||||||
const char *__env, size_t __size, const char __sep,
|
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,
|
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];
|
ENTRY *list[htab->size];
|
||||||
char *res, *p;
|
char *res, *p;
|
||||||
@ -502,6 +503,16 @@ ssize_t hexport_r(struct hsearch_data *htab, const char sep,
|
|||||||
|
|
||||||
if (htab->table[i].used > 0) {
|
if (htab->table[i].used > 0) {
|
||||||
ENTRY *ep = &htab->table[i].entry;
|
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;
|
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 */
|
/* Check if the user supplied buffer size is sufficient */
|
||||||
if (size) {
|
if (size) {
|
||||||
if (size < totlen + 1) { /* provided buffer too small */
|
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);
|
size, totlen + 1);
|
||||||
__set_errno(ENOMEM);
|
__set_errno(ENOMEM);
|
||||||
return (-1);
|
return (-1);
|
||||||
|
Loading…
Reference in New Issue
Block a user