Patchwork [U-Boot,v3,16/18] env: Add a command to display details about env flags

login
register
mail settings
Submitter Joe Hershberger
Date Nov. 1, 2012, 4:39 p.m.
Message ID <1351787996-24560-17-git-send-email-joe.hershberger@ni.com>
Download mbox | patch
Permalink /patch/196278/
State Superseded
Delegated to: Tom Rini
Headers show

Comments

Joe Hershberger - Nov. 1, 2012, 4:39 p.m.
Similar to the env callback command, this will show details about the
options available, the static list, and the currently active variables.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
---

 README              |  1 +
 common/cmd_nvedit.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 common/env_flags.c  | 34 ++++++++++++++++++++++++++++++++
 include/env_flags.h | 11 +++++++++++
 4 files changed, 102 insertions(+)

Patch

diff --git a/README b/README
index 315ed36..58ac4e7 100644
--- a/README
+++ b/README
@@ -807,6 +807,7 @@  The following options need to be configured:
 		CONFIG_CMD_EEPROM	* EEPROM read/write support
 		CONFIG_CMD_ELF		* bootelf, bootvx
 		CONFIG_CMD_ENV_CALLBACK	* display details about env callbacks
+		CONFIG_CMD_ENV_FLAGS	* display details about env flags
 		CONFIG_CMD_EXPORTENV	* export the environment
 		CONFIG_CMD_EXT2		* ext2 command support
 		CONFIG_CMD_EXT4		* ext4 command support
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index cadf0df..4d2e86d 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -438,6 +438,59 @@  int do_env_callback(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 }
 #endif
 
+#if defined(CONFIG_CMD_ENV_FLAGS)
+static int print_static_flags(const char *var_name, const char *flags)
+{
+	enum env_flags_vartype type = env_flags_parse_vartype(flags);
+
+	printf("\t%-20s %-20s\n", var_name, env_flags_get_vartype_name(type));
+
+	return 0;
+}
+
+static int print_active_flags(ENTRY *entry)
+{
+	enum env_flags_vartype type;
+
+	if (entry->flags == 0)
+		return 0;
+
+	type = (enum env_flags_vartype)
+		(entry->flags & ENV_FLAGS_VARTYPE_BIN_MASK);
+	printf("\t%-20s %-20s\n", entry->key, env_flags_get_vartype_name(type));
+
+	return 0;
+}
+
+/*
+ * Print the flags available and what variables have flags
+ */
+int do_env_flags(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	/* Print the available variable types */
+	printf("Available variable type flags (position %d):\n",
+		ENV_FLAGS_VARTYPE_LOC);
+	puts("\tFlag\tVariable Type Name\n");
+	puts("\t----\t------------------\n");
+	env_flags_print_vartypes();
+	puts("\n");
+
+	/* Print the static flags that may exist */
+	puts("Static flags:\n");
+	printf("\t%-20s %-20s\n", "Variable Name", "Variable Type");
+	printf("\t%-20s %-20s\n", "-------------", "-------------");
+	env_attr_walk(ENV_FLAGS_LIST_STATIC, print_static_flags);
+	puts("\n");
+
+	/* walk through each variable and print the flags if non-default */
+	puts("Active flags:\n");
+	printf("\t%-20s %-20s\n", "Variable Name", "Variable Type");
+	printf("\t%-20s %-20s\n", "-------------", "-------------");
+	hwalk_r(&env_htab, print_active_flags);
+	return 0;
+}
+#endif
+
 /*
  * Interactively edit an environment variable
  */
@@ -906,6 +959,9 @@  static cmd_tbl_t cmd_env_sub[] = {
 #if defined(CONFIG_CMD_ENV_CALLBACK)
 	U_BOOT_CMD_MKENT(callback, 1, 0, do_env_callback, "", ""),
 #endif
+#if defined(CONFIG_CMD_ENV_FLAGS)
+	U_BOOT_CMD_MKENT(flags, 1, 0, do_env_flags, "", ""),
+#endif
 #if defined(CONFIG_CMD_EXPORTENV)
 	U_BOOT_CMD_MKENT(export, 4, 0, do_env_export, "", ""),
 #endif
diff --git a/common/env_flags.c b/common/env_flags.c
index 6ea995a..7afc423 100644
--- a/common/env_flags.c
+++ b/common/env_flags.c
@@ -43,6 +43,40 @@ 
 #endif
 
 static const char env_flags_vartype_rep[] = "sdxb" ENV_FLAGS_NET_VARTYPE_REPS;
+#ifdef CONFIG_CMD_ENV_FLAGS
+static const char * const env_flags_vartype_names[] = {
+	"string",
+	"decimal",
+	"hexadecimal",
+	"boolean",
+#ifdef CONFIG_CMD_NET
+	"IP address",
+	"MAC address",
+#endif
+};
+
+/*
+ * Print the whole list of available type flags.
+ */
+void env_flags_print_vartypes(void)
+{
+	enum env_flags_vartype curtype = (enum env_flags_vartype)0;
+
+	while (curtype != env_flags_vartype_end) {
+		printf("\t%c   -\t%s\n", env_flags_vartype_rep[curtype],
+			env_flags_vartype_names[curtype]);
+		curtype++;
+	}
+}
+
+/*
+ * Return the name of the type.
+ */
+const char *env_flags_get_vartype_name(enum env_flags_vartype type)
+{
+	return env_flags_vartype_names[type];
+}
+#endif /* CONFIG_CMD_ENV_FLAGS */
 
 /*
  * Parse the flags string from a .flags attribute list into the vartype enum.
diff --git a/include/env_flags.h b/include/env_flags.h
index 3333446..7e72523 100644
--- a/include/env_flags.h
+++ b/include/env_flags.h
@@ -47,6 +47,17 @@  enum env_flags_vartype {
 #define ENV_FLAGS_LIST_STATIC \
 	CONFIG_ENV_FLAGS_LIST_STATIC
 
+#ifdef CONFIG_CMD_ENV_FLAGS
+/*
+ * Print the whole list of available type flags.
+ */
+void env_flags_print_vartypes(void);
+/*
+ * Return the name of the type.
+ */
+const char *env_flags_get_vartype_name(enum env_flags_vartype type);
+#endif
+
 /*
  * Parse the flags string from a .flags attribute list into the vartype enum.
  */