]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
tools/env: allow config filename to be passed via command line argument
authorMichael Heimpold <mhei@heimpold.de>
Tue, 27 Oct 2015 21:34:49 +0000 (22:34 +0100)
committerTom Rini <trini@konsulko.com>
Wed, 18 Nov 2015 13:47:02 +0000 (08:47 -0500)
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
tools/env/fw_env_main.c

index daa02a760e3744b252269113f1784671ed2fb03f..ba11f7727b8ecea8c3f64b7d169c29c4699bd0b7 100644 (file)
@@ -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
index ce50d58b64648d853ae79fa697167557d6b8ea75..234c0615443c1547044be0461d132f080df368c5 100644 (file)
@@ -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;