]> Git Repo - u-boot.git/blobdiff - common/cli_hush.c
common: Reword CONSOLE_RECORD_.*SIZE help texts
[u-boot.git] / common / cli_hush.c
index 8f86e4aa4a49e8e80a1f247951640fbbf2541d01..9cda97f30e3c7fb241bf74b12b49f54f4565e0fc 100644 (file)
 
 #define __U_BOOT__
 #ifdef __U_BOOT__
+#include <common.h>         /* readline */
 #include <env.h>
 #include <malloc.h>         /* malloc, free, realloc*/
 #include <linux/ctype.h>    /* isalpha, isdigit */
-#include <common.h>        /* readline */
 #include <console.h>
 #include <bootretry.h>
 #include <cli.h>
 #include <cli_hush.h>
 #include <command.h>        /* find_cmd */
-#ifndef CONFIG_SYS_PROMPT_HUSH_PS2
-#define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
-#endif
+#include <asm/global_data.h>
 #endif
 #ifndef __U_BOOT__
 #include <ctype.h>     /* isalpha, isdigit */
 #define applet_name "hush"
 #include "standalone.h"
 #define hush_main main
-#undef CONFIG_FEATURE_SH_FANCY_PROMPT
 #define BB_BANNER
 #endif
 #endif
@@ -327,7 +324,7 @@ typedef struct {
 /* I can almost use ordinary FILE *.  Is open_memstream() universally
  * available?  Where is it documented? */
 struct in_str {
-       const char *p;
+       const unsigned char *p;
 #ifndef __U_BOOT__
        char peek_buf[2];
 #endif
@@ -1675,7 +1672,7 @@ static int run_pipe_real(struct pipe *pi)
                        return -1;
                }
                /* Process the command */
-               return cmd_process(flag, child->argc, child->argv,
+               return cmd_process(flag, child->argc - i, child->argv + i,
                                   &flag_repeat, NULL);
 #endif
        }
@@ -1849,8 +1846,7 @@ static int run_list_real(struct pipe *pi)
                                continue;
                        } else {
                                /* insert new value from list for variable */
-                               if (pi->progs->argv[0])
-                                       free(pi->progs->argv[0]);
+                               free(pi->progs->argv[0]);
                                pi->progs->argv[0] = *list++;
 #ifndef __U_BOOT__
                                pi->progs->glob_result.gl_pathv[0] =
@@ -1905,7 +1901,7 @@ static int run_list_real(struct pipe *pi)
                        last_return_code = -rcode - 2;
                        return -2;      /* exit */
                }
-               last_return_code=(rcode == 0) ? 0 : 1;
+               last_return_code = rcode;
 #endif
 #ifndef __U_BOOT__
                pi->num_progs = save_num_progs; /* restore number of programs */
@@ -2171,24 +2167,22 @@ int set_local_var(const char *s, int flg_export)
 
        name=strdup(s);
 
-#ifdef __U_BOOT__
-       if (env_get(name) != NULL) {
-               printf ("ERROR: "
-                               "There is a global environment variable with the same name.\n");
-               free(name);
-               return -1;
-       }
-#endif
        /* Assume when we enter this function that we are already in
         * NAME=VALUE format.  So the first order of business is to
         * split 's' on the '=' into 'name' and 'value' */
        value = strchr(name, '=');
-       if (value == NULL || *(value + 1) == 0) {
+       if (!value) {
                free(name);
                return -1;
        }
        *value++ = 0;
 
+       if (!*value) {
+               unset_local_var(name);
+               free(name);
+               return 0;
+       }
+
        for(cur = top_vars; cur; cur = cur->next) {
                if(strcmp(cur->name, name)==0)
                        break;
@@ -3223,7 +3217,15 @@ static int parse_stream_outer(struct in_str *inp, int flag)
                                        printf("exit not allowed from main input shell.\n");
                                        continue;
                                }
-                               break;
+                               /*
+                                * DANGER
+                                * Return code -2 is special in this context,
+                                * it indicates exit from inner pipe instead
+                                * of return code itself, the return code is
+                                * stored in 'last_return_code' variable!
+                                * DANGER
+                                */
+                               return -2;
                        }
                        if (code == -1)
                            flag_repeat = 0;
@@ -3260,9 +3262,9 @@ int parse_string_outer(const char *s, int flag)
 #endif /* __U_BOOT__ */
 {
        struct in_str input;
+       int rcode;
 #ifdef __U_BOOT__
        char *p = NULL;
-       int rcode;
        if (!s)
                return 1;
        if (!*s)
@@ -3274,11 +3276,12 @@ int parse_string_outer(const char *s, int flag)
                setup_string_in_str(&input, p);
                rcode = parse_stream_outer(&input, flag);
                free(p);
-               return rcode;
+               return rcode == -2 ? last_return_code : rcode;
        } else {
 #endif
        setup_string_in_str(&input, s);
-       return parse_stream_outer(&input, flag);
+       rcode = parse_stream_outer(&input, flag);
+       return rcode == -2 ? last_return_code : rcode;
 #ifdef __U_BOOT__
        }
 #endif
@@ -3298,23 +3301,10 @@ int parse_file_outer(void)
        setup_file_in_str(&input);
 #endif
        rcode = parse_stream_outer(&input, FLAG_PARSE_SEMICOLON);
-       return rcode;
+       return rcode == -2 ? last_return_code : rcode;
 }
 
 #ifdef __U_BOOT__
-#ifdef CONFIG_NEEDS_MANUAL_RELOC
-static void u_boot_hush_reloc(void)
-{
-       unsigned long addr;
-       struct reserved_combo *r;
-
-       for (r=reserved_list; r<reserved_list+NRES; r++) {
-               addr = (ulong) (r->literal) + gd->reloc_off;
-               r->literal = (char *)addr;
-       }
-}
-#endif
-
 int u_boot_hush_start(void)
 {
        if (top_vars == NULL) {
@@ -3324,9 +3314,6 @@ int u_boot_hush_start(void)
                top_vars->next = NULL;
                top_vars->flg_export = 0;
                top_vars->flg_read_only = 1;
-#ifdef CONFIG_NEEDS_MANUAL_RELOC
-               u_boot_hush_reloc();
-#endif
        }
        return 0;
 }
@@ -3336,7 +3323,7 @@ static void *xmalloc(size_t size)
        void *p = NULL;
 
        if (!(p = malloc(size))) {
-           printf("ERROR : memory not allocated\n");
+           printf("ERROR : xmalloc failed\n");
            for(;;);
        }
        return p;
@@ -3347,7 +3334,7 @@ static void *xrealloc(void *ptr, size_t size)
        void *p = NULL;
 
        if (!(p = realloc(ptr, size))) {
-           printf("ERROR : memory not allocated\n");
+           printf("ERROR : xrealloc failed\n");
            for(;;);
        }
        return p;
@@ -3665,8 +3652,8 @@ static char *make_string(char **inp, int *nonnull)
 }
 
 #ifdef __U_BOOT__
-static int do_showvar(cmd_tbl_t *cmdtp, int flag, int argc,
-                     char * const argv[])
+static int do_showvar(struct cmd_tbl *cmdtp, int flag, int argc,
+                     char *const argv[])
 {
        int i, k;
        int rcode = 0;
This page took 0.028704 seconds and 4 git commands to generate.