Changed implementation such that fw_printenv returns failure status when one or 
more specified variables do not exist or when incorrect command syntax is used.

This aids scripting fw_printenv such that the script can key of the return 
status rather than relying on standard error "scraping".

  Tested On:
    AMCC Kilauea

  Tests Run:
        [EMAIL PROTECTED] fw_printenv
        bootdelay=5
        baudrate=115200
        ...
        [EMAIL PROTECTED] echo $?
        0
        
        [EMAIL PROTECTED] fw_printenv -n hostname
        kilauea
        [EMAIL PROTECTED] echo $?
        0
        
        [EMAIL PROTECTED] fw_printenv -n hostname ipaddr
        ## Error: `-n' option requires exactly one argument
        [EMAIL PROTECTED] echo $?
        1
        
        [EMAIL PROTECTED] fw_printenv hostname ipaddr
        hostname=kilauea
        ipaddr=192.168.1.12
        [EMAIL PROTECTED] echo $?
        0
        
        [EMAIL PROTECTED] fw_printenv foobar
        ## Error: "foobar" not defined
        [EMAIL PROTECTED] echo $?
        1 

        [EMAIL PROTECTED] fw_printenv hostname ipaddr foobar
        hostname=kilauea
        ipaddr=192.168.1.12
        ## Error: "foobar" not defined
        [EMAIL PROTECTED] echo $?
        1

Signed-off-by: Grant Erickson <[EMAIL PROTECTED]>
---
 tools/env/fw_env.c      |   19 ++++++++++++-------
 tools/env/fw_env.h      |    2 +-
 tools/env/fw_env_main.c |   30 +++++++++++++++---------------
 3 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index e083a5b..d06844c 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -209,13 +209,14 @@ char *fw_getenv (char *name)
  * Print the current definition of one, or more, or all
  * environment variables
  */
-void fw_printenv (int argc, char *argv[])
+int fw_printenv (int argc, char *argv[])
 {
        char *env, *nxt;
        int i, n_flag;
+       int errflag = 0;
 
        if (env_init ())
-               return;
+               return (-1);
 
        if (argc == 1) {                /* Print all env variables  */
                for (env = environment.data; *env; env = nxt + 1) {
@@ -223,13 +224,13 @@ void fw_printenv (int argc, char *argv[])
                                if (nxt >= &environment.data[ENV_SIZE]) {
                                        fprintf (stderr, "## Error: "
                                                "environment not terminated\n");
-                                       return;
+                                       return (-1);
                                }
                        }
 
                        printf ("%s\n", env);
                }
-               return;
+               return (0);
        }
 
        if (strcmp (argv[1], "-n") == 0) {
@@ -239,7 +240,7 @@ void fw_printenv (int argc, char *argv[])
                if (argc != 2) {
                        fprintf (stderr, "## Error: "
                                "`-n' option requires exactly one argument\n");
-                       return;
+                       return (-1);
                }
        } else {
                n_flag = 0;
@@ -255,7 +256,7 @@ void fw_printenv (int argc, char *argv[])
                                if (nxt >= &environment.data[ENV_SIZE]) {
                                        fprintf (stderr, "## Error: "
                                                "environment not terminated\n");
-                                       return;
+                                       return (-1);
                                }
                        }
                        val = envmatch (name, env);
@@ -268,9 +269,13 @@ void fw_printenv (int argc, char *argv[])
                                break;
                        }
                }
-               if (!val)
+               if (!val) {
                        fprintf (stderr, "## Error: \"%s\" not defined\n", 
name);
+                       errflag++;
+               }
        }
+
+       return (errflag ? -1 : 0);
 }
 
 /*
diff --git a/tools/env/fw_env.h b/tools/env/fw_env.h
index 58607de..231dd86 100644
--- a/tools/env/fw_env.h
+++ b/tools/env/fw_env.h
@@ -47,7 +47,7 @@
        "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; "   
\
        "bootm"
 
-extern void  fw_printenv(int argc, char *argv[]);
+extern int fw_printenv(int argc, char *argv[]);
 extern char *fw_getenv  (char *name);
 extern int fw_setenv  (int argc, char *argv[]);
 
diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c
index 696e30e..f50b774 100644
--- a/tools/env/fw_env_main.c
+++ b/tools/env/fw_env_main.c
@@ -25,10 +25,11 @@
  * Command line user interface to firmware (=U-Boot) environment.
  *
  * Implements:
- *     fw_printenv [ name ... ]
- *             - prints the values of the environment variables
- *               "name", or the whole environment if no names are
- *               specified
+ *     fw_printenv [[ -n name ] | [ name ... ]]
+ *             - prints the value of a single environment variable
+ *               "name", the values of one or more environment
+ *               variables "name", or the whole environment if no names
+ *               are specified.
  *     fw_setenv name [ value ... ]
  *             - If a name without any values is given, the variable
  *               with this name is deleted from the environment;
@@ -51,6 +52,7 @@ main(int argc, char *argv[])
 {
        char *p;
        char *cmdname = *argv;
+       int errflag = 0;
 
        if ((p = strrchr (cmdname, '/')) != NULL) {
                cmdname = p + 1;
@@ -58,21 +60,19 @@ main(int argc, char *argv[])
 
        if (strcmp(cmdname, CMD_PRINTENV) == 0) {
 
-                       fw_printenv (argc, argv);
-
-                       return (EXIT_SUCCESS);
+                       errflag += (fw_printenv (argc, argv) != 0);
 
        } else if (strcmp(cmdname, CMD_SETENV) == 0) {
 
-                       if (fw_setenv (argc, argv) != 0)
-                               return (EXIT_FAILURE);
+                       errflag += (fw_setenv (argc, argv) != 0);
 
-                       return (EXIT_SUCCESS);
+       } else {
+                       fprintf (stderr,
+                                "Identity crisis - may be called as `"
+                                CMD_PRINTENV
+                                "' or as `" CMD_SETENV "' but not as `%s'\n",
+                                cmdname);
        }
 
-       fprintf (stderr,
-               "Identity crisis - may be called as `" CMD_PRINTENV
-               "' or as `" CMD_SETENV "' but not as `%s'\n",
-               cmdname);
-       return (EXIT_FAILURE);
+       return (errflag ? EXIT_FAILURE : EXIT_SUCCESS);
 }
-- 
1.5.4.3


-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
U-Boot-Users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to