diff options
Diffstat (limited to 'common/env_flags.c')
| -rw-r--r-- | common/env_flags.c | 75 | 
1 files changed, 75 insertions, 0 deletions
| diff --git a/common/env_flags.c b/common/env_flags.c index a58d614bb..ed0857cf9 100644 --- a/common/env_flags.c +++ b/common/env_flags.c @@ -24,8 +24,17 @@  #include <linux/string.h>  #include <linux/ctype.h> +#ifdef USE_HOSTCC /* Eliminate "ANSI does not permit..." warnings */ +#include <stdint.h> +#include <stdio.h> +#include "fw_env.h" +#include <env_attr.h> +#include <env_flags.h> +#define getenv fw_getenv +#else  #include <common.h>  #include <environment.h> +#endif  #ifdef CONFIG_CMD_NET  #define ENV_FLAGS_NET_VARTYPE_REPS "im" @@ -179,6 +188,70 @@ static inline int env_flags_lookup(const char *flags_list, const char *name,  	return ret;  } +#ifdef USE_HOSTCC /* Functions only used from tools/env */ +/* + * Look up any flags directly from the .flags variable and the static list + * and convert them to the vartype enum. + */ +enum env_flags_vartype env_flags_get_type(const char *name) +{ +	const char *flags_list = getenv(ENV_FLAGS_VAR); +	char flags[ENV_FLAGS_ATTR_MAX_LEN + 1]; + +	if (env_flags_lookup(flags_list, name, flags)) +		return env_flags_vartype_string; + +	if (strlen(flags) <= ENV_FLAGS_VARTYPE_LOC) +		return env_flags_vartype_string; + +	return env_flags_parse_vartype(flags); +} + +/* + * Validate that the proposed new value for "name" is valid according to the + * defined flags for that variable, if any. + */ +int env_flags_validate_type(const char *name, const char *value) +{ +	enum env_flags_vartype type; + +	if (value == NULL) +		return 0; +	type = env_flags_get_type(name); +	if (_env_flags_validate_type(value, type) < 0) { +		printf("## Error: flags type check failure for " +			"\"%s\" <= \"%s\" (type: %c)\n", +			name, value, env_flags_vartype_rep[type]); +		return -1; +	} +	return 0; +} + +/* + * Validate the parameters to "env set" directly + */ +int env_flags_validate_env_set_params(int argc, char * const argv[]) +{ +	if ((argc >= 3) && argv[2] != NULL) { +		enum env_flags_vartype type = env_flags_get_type(argv[1]); + +		/* +		 * we don't currently check types that need more than +		 * one argument +		 */ +		if (type != env_flags_vartype_string && argc > 3) { +			printf("## Error: too many parameters for setting " +				"\"%s\"\n", argv[1]); +			return -1; +		} +		return env_flags_validate_type(argv[1], argv[2]); +	} +	/* ok */ +	return 0; +} + +#else /* !USE_HOSTCC - Functions only used from lib/hashtable.c */ +  /*   * Parse the flag charachters from the .flags attribute list into the binary   * form to be stored in the environment entry->flags field. @@ -317,3 +390,5 @@ int env_flags_validate(const ENTRY *item, const char *newval, enum env_op op,  	return 0;  } + +#endif |