diff mbox

[U-Boot] tools/env: allow config filename to be passed via command line argument

Message ID 1445981689-9385-1-git-send-email-mhei@heimpold.de
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Michael Heimpold Oct. 27, 2015, 9:34 p.m. UTC
When for example generating/manipulating SD card/eMMC images which
contain U-Boot and its environment(s), it is handy to use a given
configuration file instead of the compiled-in default one.
And since the default configuration file is expected under /etc
it's hard for an usual linux user account without special permissions
to use fw_printenv/fw_setenv for this purpose.
So allow to pass an optional filename via a new '-c' command
line argument.

Example:

$ ln -s fw_printenv tools/env/fw_setenv
$ cat fw_env.config
test.img 0x20000 0x20000
test.img 0x40000 0x20000

$ tools/env/fw_printenv -c ./fw_env.config fdt_file
fdt_file=imx28-duckbill.dtb

$ tools/env/fw_setenv -c ./fw_env.config fdt_file imx28-duckbill-spi.dtb

$ tools/env/fw_printenv -c ./fw_env.config fdt_file
fdt_file=imx28-duckbill-spi.dtb

Signed-off-by: Michael Heimpold <mhei@heimpold.de>
---
 tools/env/fw_env.c      |   31 +++++++++++++++++++++++++++++--
 tools/env/fw_env_main.c |   10 +++++++++-
 2 files changed, 38 insertions(+), 3 deletions(-)

Comments

Tom Rini Nov. 18, 2015, 10:33 p.m. UTC | #1
On Tue, Oct 27, 2015 at 10:34:49PM +0100, Michael Heimpold wrote:

> When for example generating/manipulating SD card/eMMC images which
> contain U-Boot and its environment(s), it is handy to use a given
> configuration file instead of the compiled-in default one.
> And since the default configuration file is expected under /etc
> it's hard for an usual linux user account without special permissions
> to use fw_printenv/fw_setenv for this purpose.
> So allow to pass an optional filename via a new '-c' command
> line argument.
> 
> Example:
> 
> $ ln -s fw_printenv tools/env/fw_setenv
> $ cat fw_env.config
> test.img 0x20000 0x20000
> test.img 0x40000 0x20000
> 
> $ tools/env/fw_printenv -c ./fw_env.config fdt_file
> fdt_file=imx28-duckbill.dtb
> 
> $ tools/env/fw_setenv -c ./fw_env.config fdt_file imx28-duckbill-spi.dtb
> 
> $ tools/env/fw_printenv -c ./fw_env.config fdt_file
> fdt_file=imx28-duckbill-spi.dtb
> 
> Signed-off-by: Michael Heimpold <mhei@heimpold.de>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index daa02a7..ba11f77 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -124,6 +124,7 @@  static int parse_config (void);
 
 #if defined(CONFIG_FILE)
 static int get_config (char *);
+static char *config_file = CONFIG_FILE;
 #endif
 static inline ulong getenvsize (void)
 {
@@ -246,6 +247,19 @@  int fw_printenv (int argc, char *argv[])
 	int i, n_flag;
 	int rc = 0;
 
+#ifdef CONFIG_FILE
+	if (argc >= 2 && strcmp(argv[1], "-c") == 0) {
+		if (argc < 3) {
+			fprintf(stderr,
+				"## Error: '-c' option requires the config file to use\n");
+			return -1;
+		}
+		config_file = argv[2];
+		argv += 2;
+		argc -= 2;
+	}
+#endif
+
 	if (argc >= 2 && strcmp(argv[1], "-a") == 0) {
 		if (argc < 3) {
 			fprintf(stderr,
@@ -486,6 +500,19 @@  int fw_setenv(int argc, char *argv[])
 	char *name;
 	char *value = NULL;
 
+#ifdef CONFIG_FILE
+	if (argc >= 2 && strcmp(argv[1], "-c") == 0) {
+		if (argc < 3) {
+			fprintf(stderr,
+				"## Error: '-c' option requires the config file to use\n");
+			return -1;
+		}
+		config_file = argv[2];
+		argv += 2;
+		argc -= 2;
+	}
+#endif
+
 	if (argc < 2) {
 		errno = EINVAL;
 		return -1;
@@ -1364,9 +1391,9 @@  static int parse_config ()
 
 #if defined(CONFIG_FILE)
 	/* Fills in DEVNAME(), ENVSIZE(), DEVESIZE(). Or don't. */
-	if (get_config (CONFIG_FILE)) {
+	if (get_config (config_file)) {
 		fprintf (stderr,
-			"Cannot parse config file: %s\n", strerror (errno));
+			"Cannot parse config file '%s': %s\n", config_file, strerror (errno));
 		return -1;
 	}
 #else
diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c
index ce50d58..234c061 100644
--- a/tools/env/fw_env_main.c
+++ b/tools/env/fw_env_main.c
@@ -50,8 +50,13 @@  void usage(void)
 
 	fprintf(stderr, "fw_printenv/fw_setenv, "
 		"a command line interface to U-Boot environment\n\n"
+#ifndef CONFIG_FILE
 		"usage:\tfw_printenv [-a key] [-n] [variable name]\n"
 		"\tfw_setenv [-a key] [variable name] [variable value]\n"
+#else
+		"usage:\tfw_printenv [-c /my/fw_env.config] [-a key] [-n] [variable name]\n"
+		"\tfw_setenv [-c /my/fw_env.config] [-a key] [variable name] [variable value]\n"
+#endif
 		"\tfw_setenv -s [ file ]\n"
 		"\tfw_setenv -s - < [ file ]\n\n"
 		"The file passed as argument contains only pairs "
@@ -98,12 +103,15 @@  int main(int argc, char *argv[])
 		cmdname = p + 1;
 	}
 
-	while ((c = getopt_long (argc, argv, "a:ns:h",
+	while ((c = getopt_long (argc, argv, "a:c:ns:h",
 		long_options, NULL)) != EOF) {
 		switch (c) {
 		case 'a':
 			/* AES key, handled later */
 			break;
+		case 'c':
+			/* handled later */
+			break;
 		case 'n':
 			/* handled in fw_printenv */
 			break;