|
@@ -24,8 +24,17 @@
|
|
#include <linux/string.h>
|
|
#include <linux/string.h>
|
|
#include <linux/ctype.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 <common.h>
|
|
#include <environment.h>
|
|
#include <environment.h>
|
|
|
|
+#endif
|
|
|
|
|
|
#ifdef CONFIG_CMD_NET
|
|
#ifdef CONFIG_CMD_NET
|
|
#define ENV_FLAGS_NET_VARTYPE_REPS "im"
|
|
#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;
|
|
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
|
|
* Parse the flag charachters from the .flags attribute list into the binary
|
|
* form to be stored in the environment entry->flags field.
|
|
* 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;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+#endif
|