[U-Boot] [PATCH v0 3/4] env: implement selective "env default"
Gerlando Falauto
gerlando.falauto at keymile.com
Wed Oct 26 18:37:51 CEST 2011
Signed-off-by: Gerlando Falauto <gerlando.falauto at keymile.com>
---
README | 2 ++
common/cmd_nvedit.c | 42 ++++++++++++++++++++++++++++++++++++------
common/env_common.c | 14 ++++++++++++++
include/config_cmd_all.h | 1 +
include/environment.h | 5 +++++
5 files changed, 58 insertions(+), 6 deletions(-)
diff --git a/README b/README
index c6b179c..b5b316f 100644
--- a/README
+++ b/README
@@ -724,6 +724,8 @@ The following options need to be configured:
CONFIG_CMD_CONSOLE coninfo
CONFIG_CMD_CRC32 * crc32
CONFIG_CMD_DATE * support for RTC, date/time...
+ CONFIG_CMD_DEFAULTENV_VARS
+ * Reset individual variables to default
CONFIG_CMD_DHCP * DHCP support
CONFIG_CMD_DIAG * Diagnostics
CONFIG_CMD_DS4510 * ds4510 I2C gpio commands
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index 905d3be..07cd062 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -638,13 +638,40 @@ int envmatch(uchar *s1, int i2)
return -1;
}
-static int do_env_default(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+static int do_env_default(cmd_tbl_t *cmdtp, int __flag, int argc,
+ char * const argv[])
{
- if ((argc != 2) || (strcmp(argv[1], "-f") != 0))
- return cmd_usage(cmdtp);
-
- set_default_env("## Resetting to default environment\n");
- return 0;
+ int all = 0, flag = 0;
+ debug("Initial value for argc=%d\n", argc);
+ while (--argc > 0 && **++argv == '-') {
+ char *arg = *argv;
+ while (*++arg) {
+ switch (*arg) {
+ case 'a': /* default all */
+ all = 1;
+ break;
+ case 'f': /* force */
+ flag |= H_FORCE;
+ break;
+ default:
+ return cmd_usage(cmdtp);
+ }
+ }
+ }
+ debug("Final value for argc=%d\n", argc);
+ if (all && (argc == 0)) {
+ /* Reset the whole environment */
+ set_default_env("## Resetting to default environment\n");
+ return 0;
+ }
+#if CONFIG_CMD_DEFAULTENV_VARS
+ if (!all && (argc > 0)) {
+ /* Reset individual variables */
+ env_default_vars(argc, argv);
+ return 0;
+ }
+#endif
+ return cmd_usage(cmdtp);
}
static int do_env_delete(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
@@ -970,6 +997,9 @@ U_BOOT_CMD(
"ask name [message] [size] - ask for environment variable\nenv "
#endif
"default -f - reset default environment\n"
+#if defined(CONFIG_CMD_DEFAULTENV_VARS)
+ "env default var [...] - reset variable(s) to their default value\n"
+#endif
#if defined(CONFIG_CMD_EDITENV)
"env edit name - edit environment variable\n"
#endif
diff --git a/common/env_common.c b/common/env_common.c
index db607e1..af28d47 100644
--- a/common/env_common.c
+++ b/common/env_common.c
@@ -207,6 +207,20 @@ void set_default_env(const char *s)
gd->flags |= GD_FLG_ENV_READY;
}
+#ifdef CONFIG_CMD_DEFAULTENV_VARS
+
+/* [re]set individual variables to their value in the default environment */
+int env_default_vars(int nvars, char * const vars[])
+{
+ /* Special use-case: import from default environment
+ (and use \0 as a separator) */
+ return himport_ex(&env_htab, (const char *)default_environment,
+ sizeof(default_environment), '\0', H_NOCLEAR,
+ nvars, vars, env_check_apply);
+}
+
+#endif /* CONFIG_CMD_DEFAULTENV_VARS */
+
/*
* Check if CRC is valid and (if yes) import the environment.
* Note that "buf" may or may not be aligned.
diff --git a/include/config_cmd_all.h b/include/config_cmd_all.h
index 9716f9c..e728eae 100644
--- a/include/config_cmd_all.h
+++ b/include/config_cmd_all.h
@@ -25,6 +25,7 @@
#define CONFIG_CMD_CDP /* Cisco Discovery Protocol */
#define CONFIG_CMD_CONSOLE /* coninfo */
#define CONFIG_CMD_DATE /* support for RTC, date/time...*/
+#define CONFIG_CMD_DEFAULTENV_VARS /* default individ variables */
#define CONFIG_CMD_DHCP /* DHCP Support */
#define CONFIG_CMD_DIAG /* Diagnostics */
#define CONFIG_CMD_DISPLAY /* Display support */
diff --git a/include/environment.h b/include/environment.h
index cd98f91..b9201d3 100644
--- a/include/environment.h
+++ b/include/environment.h
@@ -171,6 +171,11 @@ void env_crc_update (void);
/* [re]set to the default environment */
void set_default_env(const char *s);
+#ifdef CONFIG_CMD_DEFAULTENV_VARS
+/* [re]set individual variables to their value in the default environment */
+int env_default_vars(int nvars, char * const vars[]);
+#endif
+
/* Import from binary representation into hash table */
int env_import(const char *buf, int check);
--
1.7.1
More information about the U-Boot
mailing list