#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
/* 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
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
}
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 */
* 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;
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;
#endif /* __U_BOOT__ */
{
struct in_str input;
+ int rcode;
#ifdef __U_BOOT__
char *p = NULL;
- int rcode;
if (!s)
return 1;
if (!*s)
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
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) {
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;
}
void *p = NULL;
if (!(p = malloc(size))) {
- printf("ERROR : memory not allocated\n");
+ printf("ERROR : xmalloc failed\n");
for(;;);
}
return p;
void *p = NULL;
if (!(p = realloc(ptr, size))) {
- printf("ERROR : memory not allocated\n");
+ printf("ERROR : xrealloc failed\n");
for(;;);
}
return p;