From: Heiko Schocher Date: Wed, 15 Oct 2008 07:40:28 +0000 (+0200) Subject: hush: add showvar command for hush shell. X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=81473f67810c4c9b7efaed8dee258ed6bc4c7983;p=project%2Fbcm63xx%2Fu-boot.git hush: add showvar command for hush shell. 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 --- diff --git a/common/hush.c b/common/hush.c index 093c42804d..67bed39aaf 100644 --- a/common/hush.c +++ b/common/hush.c @@ -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 */ /****************************************************************************/ diff --git a/common/main.c b/common/main.c index c06ea07d41..9a9fc9d00b 100644 --- a/common/main.c +++ b/common/main.c @@ -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 diff --git a/include/hush.h b/include/hush.h index 20e48dbefd..0805ff3d88 100644 --- a/include/hush.h +++ b/include/hush.h @@ -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