env: make "env default" selective, check and apply

Change the syntax (user API) for "env default":
  -f: override write-once variables
  var... : accept individual variable(s)
  -a: all (resetting the whole env is NOT the default behavior)

Enable variable checking and make changes effective by
enabling do_apply argument to himport_r().

Signed-off-by: Gerlando Falauto <gerlando.falauto@keymile.com>
This commit is contained in:
Gerlando Falauto
2012-08-24 00:11:41 +00:00
committed by Tom Rini
parent 152874b65b
commit b64b7c3df7
3 changed files with 64 additions and 7 deletions

View File

@@ -180,6 +180,11 @@ const uchar *env_get_addr(int index)
void set_default_env(const char *s)
{
/*
* By default, do not apply changes as they will eventually
* be applied by someone else
*/
int do_apply = 0;
if (sizeof(default_environment) > ENV_SIZE) {
puts("*** Error - default environment is too large\n\n");
return;
@@ -191,6 +196,14 @@ void set_default_env(const char *s)
"using default environment\n\n",
s + 1);
} else {
/*
* This set_to_default was explicitly asked for
* by the user, as opposed to being a recovery
* mechanism. Therefore we check every single
* variable and apply changes to the system
* right away (e.g. baudrate, console).
*/
do_apply = 1;
puts(s);
}
} else {
@@ -199,12 +212,25 @@ void set_default_env(const char *s)
if (himport_r(&env_htab, (char *)default_environment,
sizeof(default_environment), '\0', 0,
0, NULL, 0 /* do_apply */) == 0)
0, NULL, do_apply) == 0)
error("Environment import failed: errno = %d\n", errno);
gd->flags |= GD_FLG_ENV_READY;
}
/* [re]set individual variables to their value in the default environment */
int set_default_vars(int nvars, char * const vars[])
{
/*
* Special use-case: import from default environment
* (and use \0 as a separator)
*/
return himport_r(&env_htab, (const char *)default_environment,
sizeof(default_environment), '\0', H_NOCLEAR,
nvars, vars, 1 /* do_apply */);
}
/*
* Check if CRC is valid and (if yes) import the environment.
* Note that "buf" may or may not be aligned.