diff options
Diffstat (limited to 'common/env_common.c')
| -rw-r--r-- | common/env_common.c | 61 | 
1 files changed, 42 insertions, 19 deletions
| diff --git a/common/env_common.c b/common/env_common.c index 3d3cb70a6..906b41fcc 100644 --- a/common/env_common.c +++ b/common/env_common.c @@ -40,7 +40,7 @@ DECLARE_GLOBAL_DATA_PTR;  #include <env_default.h>  struct hsearch_data env_htab = { -	.apply = env_check_apply, +	.change_ok = env_flags_validate,  };  static uchar __env_get_char_spec(int index) @@ -81,13 +81,42 @@ const uchar *env_get_addr(int index)  		return &default_environment[index];  } +/* + * Read an environment variable as a boolean + * Return -1 if variable does not exist (default to true) + */ +int getenv_yesno(const char *var) +{ +	char *s = getenv(var); + +	if (s == NULL) +		return -1; +	return (*s == '1' || *s == 'y' || *s == 'Y' || *s == 't' || *s == 'T') ? +		1 : 0; +} + +/* + * Look up the variable from the default environment + */ +char *getenv_default(const char *name) +{ +	char *ret_val; +	unsigned long really_valid = gd->env_valid; +	unsigned long real_gd_flags = gd->flags; + +	/* Pretend that the image is bad. */ +	gd->flags &= ~GD_FLG_ENV_READY; +	gd->env_valid = 0; +	ret_val = getenv(name); +	gd->env_valid = really_valid; +	gd->flags = real_gd_flags; +	return ret_val; +} +  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; +	int flags = 0; +  	if (sizeof(default_environment) > ENV_SIZE) {  		puts("*** Error - default environment is too large\n\n");  		return; @@ -99,14 +128,7 @@ 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; +			flags = H_INTERACTIVE;  			puts(s);  		}  	} else { @@ -114,8 +136,8 @@ void set_default_env(const char *s)  	}  	if (himport_r(&env_htab, (char *)default_environment, -			sizeof(default_environment), '\0', 0, -			0, NULL, do_apply) == 0) +			sizeof(default_environment), '\0', flags, +			0, NULL) == 0)  		error("Environment import failed: errno = %d\n", errno);  	gd->flags |= GD_FLG_ENV_READY; @@ -130,8 +152,8 @@ int set_default_vars(int nvars, char * const vars[])  	 * (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 */); +				sizeof(default_environment), '\0', +				H_NOCLEAR | H_INTERACTIVE, nvars, vars);  }  #ifndef CONFIG_SPL_BUILD @@ -155,7 +177,7 @@ int env_import(const char *buf, int check)  	}  	if (himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '\0', 0, -			0, NULL, 0 /* do_apply */)) { +			0, NULL)) {  		gd->flags |= GD_FLG_ENV_READY;  		return 1;  	} @@ -172,6 +194,7 @@ void env_relocate(void)  {  #if defined(CONFIG_NEEDS_MANUAL_RELOC)  	env_reloc(); +	env_htab.change_ok += gd->reloc_off;  #endif  	if (gd->env_valid == 0) {  #if defined(CONFIG_ENV_IS_NOWHERE) || defined(CONFIG_SPL_BUILD) |