]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/hush.c
imported Freescale specific U-Boot additions for i.MX28,... release L2.6.31_10.08.01
[karo-tx-uboot.git] / common / hush.c
index feb5627ff2eef282b16312cbccca13b208b7ed96..528dd254a5064cf6c45c00f9b8689858222de306 100755 (executable)
@@ -1,4 +1,3 @@
-/* vi: set sw=4 ts=4: */
 /*
  * sh.c -- a prototype Bourne shell grammar parser
  *      Intended to follow the original Thompson and Ritchie
@@ -97,7 +96,6 @@
 /*cmd_boot.c*/
 extern int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);      /* do_bootd */
 #endif
-#ifdef CFG_HUSH_PARSER
 #ifndef __U_BOOT__
 #include <ctype.h>     /* isalpha, isdigit */
 #include <unistd.h>    /* getpid */
@@ -116,7 +114,6 @@ extern int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);      /
 #include <signal.h>
 
 /* #include <dmalloc.h> */
-/* #define DEBUG_SHELL */
 
 #if 1
 #include "busybox.h"
@@ -361,6 +358,11 @@ struct built_in_command {
 };
 #endif
 
+/* define DEBUG_SHELL for debugging output (obviously ;-)) */
+#if 0
+#define DEBUG_SHELL
+#endif
+
 /* This should be in utility.c */
 #ifdef DEBUG_SHELL
 #ifndef __U_BOOT__
@@ -372,7 +374,7 @@ static void debug_printf(const char *format, ...)
        va_end(args);
 }
 #else
-#define debug_printf printf             /* U-Boot debug flag */
+#define debug_printf(fmt,args...)      printf (fmt ,##args)
 #endif
 #else
 static inline void debug_printf(const char *format, ...) { }
@@ -498,10 +500,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
@@ -954,7 +952,7 @@ static int b_adduint(o_string *o, unsigned int i)
 
 static int static_get(struct in_str *i)
 {
-       int ch=*i->p++;
+       int ch = *i->p++;
        if (ch=='\0') return EOF;
        return ch;
 }
@@ -1020,9 +1018,9 @@ static void get_user_input(struct in_str *i)
        fflush(stdout);
        i->p = the_command;
 #else
-       extern char console_buffer[CFG_CBSIZE];
+       extern char console_buffer[CONFIG_SYS_CBSIZE];
        int n;
-       static char the_command[CFG_CBSIZE];
+       static char the_command[CONFIG_SYS_CBSIZE];
 
 #ifdef CONFIG_BOOT_RETRY_TIME
 #  ifdef CONFIG_RESET_TO_RETRY
@@ -1034,9 +1032,9 @@ static void get_user_input(struct in_str *i)
 #endif
        i->__promptme = 1;
        if (i->promptmode == 1) {
-               n = readline(CFG_PROMPT);
+               n = readline(CONFIG_SYS_PROMPT);
        } else {
-               n = readline(CFG_PROMPT_HUSH_PS2);
+               n = readline(CONFIG_SYS_PROMPT_HUSH_PS2);
        }
 #ifdef CONFIG_BOOT_RETRY_TIME
        if (n == -2) {
@@ -1076,7 +1074,7 @@ static void get_user_input(struct in_str *i)
        else {
                if (console_buffer[0] != '\n') {
                        if (strlen(the_command) + strlen(console_buffer)
-                           < CFG_CBSIZE) {
+                           < CONFIG_SYS_CBSIZE) {
                                n = strlen(the_command);
                                the_command[n-1] = ' ';
                                strcpy(&the_command[n],console_buffer);
@@ -1105,7 +1103,7 @@ static int file_get(struct in_str *i)
        ch = 0;
        /* If there is data waiting, eat it up */
        if (i->p && *i->p) {
-               ch=*i->p++;
+               ch = *i->p++;
        } else {
                /* need to double check i->file because we might be doing something
                 * more complicated by now, like sourcing or substituting. */
@@ -1122,7 +1120,7 @@ static int file_get(struct in_str *i)
                        i->__promptme = 0;
 #endif
                        if (i->p && *i->p) {
-                               ch=*i->p++;
+                               ch = *i->p++;
                        }
 #ifndef __U_BOOT__
                } else {
@@ -1682,7 +1680,7 @@ static int run_pipe_real(struct pipe *pi)
                                return -1;      /* give up after bad command */
                        } else {
                                int rcode;
-#if (CONFIG_COMMANDS & CFG_CMD_BOOTD)
+#if defined(CONFIG_CMD_BOOTD)
            extern int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 
                                /* avoid "bootd" recursion */
@@ -1694,10 +1692,10 @@ static int run_pipe_real(struct pipe *pi)
                                else
                                        flag |= CMD_FLAG_BOOTD;
                                }
-#endif /* CFG_CMD_BOOTD */
+#endif
                                /* found - check max args */
                                if ((child->argc - i) > cmdtp->maxargs) {
-                                       printf ("Usage:\n%s\n", cmdtp->usage);
+                                       cmd_usage(cmdtp);
                                        return -1;
                                }
 #endif
@@ -2004,7 +2002,7 @@ static int free_pipe(struct pipe *pi, int indent)
 #ifndef __U_BOOT__
                        globfree(&child->glob_result);
 #else
-                       for (a = child->argc;a >= 0;a--) {
+                       for (a = 0; a < child->argc; a++) {
                                free(child->argv[a]);
                        }
                                        free(child->argv);
@@ -2201,7 +2199,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;
@@ -2292,8 +2290,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;
 
@@ -2308,8 +2305,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)
@@ -2320,7 +2319,6 @@ static void unset_local_var(const char *name)
                }
        }
 }
-#endif
 
 static int is_assignment(const char *s)
 {
@@ -3585,5 +3583,52 @@ static char * make_string(char ** inp)
        return str;
 }
 
-#endif /* CFG_HUSH_PARSER */
+#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, CONFIG_SYS_MAXARGS, 1, do_showvar,
+       "print local hushshell variables",
+       "\n    - print values of all hushshell variables\n"
+       "showvar name ...\n"
+       "    - print value of hushshell variable 'name'"
+);
+
+#endif
 /****************************************************************************/