hush: add showvar command for hush shell.
authorHeiko Schocher <hs@denx.de>
Wed, 15 Oct 2008 07:40:28 +0000 (09:40 +0200)
committerWolfgang Denk <wd@denx.de>
Sat, 18 Oct 2008 19:54:02 +0000 (21:54 +0200)
This new command shows the local variables defined in
the hush shell:

=> help showvar
showvar
    - print values of all hushshell variables
showvar name ...
    - print value of hushshell variable 'name'

Also make the set_local_var() and unset_local_var ()
no longer static, so it is possible to define local
hush shell variables at boot time. If CONFIG_HUSH_INIT_VAR
is defined, u-boot calls hush_init_var (), where
boardspecific code can define local hush shell
variables at boottime.

Signed-off-by: Heiko Schocher <hs@denx.de>
common/hush.c
common/main.c
include/hush.h

index 093c42804d88fa80fc22287caed67310c86629a4..67bed39aafa1f2a1bb3d847681aecd5cd81a2fce 100644 (file)
@@ -501,10 +501,6 @@ static void remove_bg_job(struct pipe *pi);
 static char **make_list_in(char **inp, char *name);
 static char *insert_var_value(char *inp);
 static char *get_local_var(const char *var);
-#ifndef __U_BOOT__
-static void  unset_local_var(const char *name);
-#endif
-static int set_local_var(const char *s, int flg_export);
 
 #ifndef __U_BOOT__
 /* Table of built-in functions.  They can be forked or not, depending on
@@ -2204,7 +2200,7 @@ static char *get_local_var(const char *s)
    flg_export==0 if only local (not exporting) variable
    flg_export==1 if "new" exporting environ
    flg_export>1  if current startup environ (not call putenv()) */
-static int set_local_var(const char *s, int flg_export)
+int set_local_var(const char *s, int flg_export)
 {
        char *name, *value;
        int result=0;
@@ -2295,8 +2291,7 @@ static int set_local_var(const char *s, int flg_export)
        return result;
 }
 
-#ifndef __U_BOOT__
-static void unset_local_var(const char *name)
+void unset_local_var(const char *name)
 {
        struct variables *cur;
 
@@ -2311,8 +2306,10 @@ static void unset_local_var(const char *name)
                                error_msg("%s: readonly variable", name);
                                return;
                        } else {
+#ifndef __U_BOOT__
                                if(cur->flg_export)
                                        unsetenv(cur->name);
+#endif
                                free(cur->name);
                                free(cur->value);
                                while (next->next != cur)
@@ -2323,7 +2320,6 @@ static void unset_local_var(const char *name)
                }
        }
 }
-#endif
 
 static int is_assignment(const char *s)
 {
@@ -3588,5 +3584,53 @@ static char * make_string(char ** inp)
        return str;
 }
 
+#ifdef __U_BOOT__
+int do_showvar (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       int i, k;
+       int rcode = 0;
+       struct variables *cur;
+
+       if (argc == 1) {                /* Print all env variables      */
+               for (cur = top_vars; cur; cur = cur->next) {
+                       printf ("%s=%s\n", cur->name, cur->value);
+                       if (ctrlc ()) {
+                               puts ("\n ** Abort\n");
+                               return 1;
+                       }
+               }
+               return 0;
+       }
+       for (i = 1; i < argc; ++i) {    /* print single env variables   */
+               char *name = argv[i];
+
+               k = -1;
+               for (cur = top_vars; cur; cur = cur->next) {
+                       if(strcmp (cur->name, name) == 0) {
+                               k = 0;
+                               printf ("%s=%s\n", cur->name, cur->value);
+                       }
+                       if (ctrlc ()) {
+                               puts ("\n ** Abort\n");
+                               return 1;
+                       }
+               }
+               if (k < 0) {
+                       printf ("## Error: \"%s\" not defined\n", name);
+                       rcode ++;
+               }
+       }
+       return rcode;
+}
+
+U_BOOT_CMD(
+       showvar, CFG_MAXARGS, 1,        do_showvar,
+       "showvar- print local hushshell variables\n",
+       "\n    - print values of all hushshell variables\n"
+       "showvar name ...\n"
+       "    - print value of hushshell variable 'name'\n"
+);
+
+#endif
 #endif /* CFG_HUSH_PARSER */
 /****************************************************************************/
index c06ea07d414aa744ca90ef19ea0cc9002d3dcb5a..9a9fc9d00b9496bd2e45a7117558f4a65bb2bfd6 100644 (file)
@@ -341,6 +341,10 @@ void main_loop (void)
        u_boot_hush_start ();
 #endif
 
+#if defined(CONFIG_HUSH_INIT_VAR)
+       hush_init_var ();
+#endif
+
 #ifdef CONFIG_AUTO_COMPLETE
        install_auto_complete();
 #endif
index 20e48dbefd0607c35534fc47e1d85db6dd61c74b..0805ff3d8806109ae38693e213c012cb28838655 100644 (file)
@@ -32,4 +32,10 @@ extern int u_boot_hush_start(void);
 extern int parse_string_outer(char *, int);
 extern int parse_file_outer(void);
 
+int set_local_var(const char *s, int flg_export);
+void unset_local_var(const char *name);
+
+#if defined(CONFIG_HUSH_INIT_VAR)
+extern int hush_init_var (void);
+#endif
 #endif