summaryrefslogtreecommitdiffstats
path: root/common/hush.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2007-07-05 18:01:49 +0200
committerSascha Hauer <sha@octopus.labnet.pengutronix.de>2007-07-05 18:01:49 +0200
commit5f9cd32802f379d645caa5666faff6c7b8410c3d (patch)
treead2ba465adeb6519d139787b65d8b97916d9b63f /common/hush.c
parentd729a09f52dfafab555fa5e6e9d0cb22b4bb15fb (diff)
downloadbarebox-5f9cd32802f379d645caa5666faff6c7b8410c3d.tar.gz
barebox-5f9cd32802f379d645caa5666faff6c7b8410c3d.tar.xz
svn_rev_392
- remove u_boot_hush_start() - remove u_boot_hush_reloc() - remove repeatable commands - do not use local variable handling anymore
Diffstat (limited to 'common/hush.c')
-rw-r--r--common/hush.c239
1 files changed, 35 insertions, 204 deletions
diff --git a/common/hush.c b/common/hush.c
index cd4443cc1a..de8a9073fe 100644
--- a/common/hush.c
+++ b/common/hush.c
@@ -96,6 +96,10 @@
#include <hush.h>
#include <environment.h>
#include <command.h> /* find_cmd */
+#include <driver.h>
+#include <errno.h>
+#include <fs.h>
+
/*cmd_boot.c*/
extern int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); /* do_bootd */
#endif
@@ -267,7 +271,6 @@ struct close_me {
int fd;
struct close_me *next;
};
-#endif
struct variables {
char *name;
@@ -276,6 +279,8 @@ struct variables {
int flg_read_only;
struct variables *next;
};
+#endif
+
/* globals, connect us to the outside world
* the first three support $?, $#, and $1 */
@@ -305,10 +310,6 @@ static char *PS1;
static char *PS2;
struct variables shell_ver = { "HUSH_VERSION", "0.01", 1, 1, 0 };
struct variables *top_vars = &shell_ver;
-#else
-static int flag_repeat = 0;
-static int do_repeat = 0;
-static struct variables *top_vars = NULL ;
#endif /*__U_BOOT__ */
#define B_CHUNK (100)
@@ -755,7 +756,7 @@ static int builtin_read(struct child_prog *child)
/* read string */
fgets(string, sizeof(string), stdin);
chomp(string);
- var = malloc(strlen(child->argv[1])+strlen(string)+2);
+ var = xmalloc(strlen(child->argv[1])+strlen(string)+2);
if(var) {
sprintf(var, "%s=%s", child->argv[1], string);
res = set_local_var(var, 0);
@@ -986,6 +987,17 @@ static inline void setup_prompt_string(int promptmode, char **prompt_str)
}
#endif
+static char *getprompt(void)
+{
+ static char *prompt;
+
+ if (!prompt)
+ prompt = xmalloc(PATH_MAX + strlen(CONFIG_PROMPT) + 1);
+
+ sprintf(prompt, "%s%s ", CONFIG_PROMPT, getcwd());
+ return prompt;
+}
+
static void get_user_input(struct in_str *i)
{
#ifndef __U_BOOT__
@@ -1014,56 +1026,23 @@ static void get_user_input(struct in_str *i)
int n;
static char the_command[CONFIG_CBSIZE];
-#ifdef CONFIG_BOOT_RETRY_TIME
-# ifdef CONFIG_RESET_TO_RETRY
- extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
-# else
-# error "This currently only works with CONFIG_RESET_TO_RETRY enabled"
-# endif
- reset_cmd_timeout();
-#endif
i->__promptme = 1;
if (i->promptmode == 1) {
- n = readline(CONFIG_PROMPT);
+ n = readline(getprompt(), console_buffer, CONFIG_CBSIZE);
} else {
- n = readline(CONFIG_PROMPT_HUSH_PS2);
- }
-#ifdef CONFIG_BOOT_RETRY_TIME
- if (n == -2) {
- puts("\nTimeout waiting for command\n");
-# ifdef CONFIG_RESET_TO_RETRY
- do_reset(NULL, 0, 0, NULL);
-# else
-# error "This currently only works with CONFIG_RESET_TO_RETRY enabled"
-# endif
+ n = readline(CONFIG_PROMPT_HUSH_PS2, console_buffer, CONFIG_CBSIZE);
}
-#endif
if (n == -1 ) {
- flag_repeat = 0;
i->__promptme = 0;
+ n = 0;
}
- n = strlen(console_buffer);
+
console_buffer[n] = '\n';
console_buffer[n+1]= '\0';
- if (had_ctrlc()) flag_repeat = 0;
- clear_ctrlc();
- do_repeat = 0;
if (i->promptmode == 1) {
- if (console_buffer[0] == '\n'&& flag_repeat == 0) {
- strcpy(the_command,console_buffer);
- }
- else {
- if (console_buffer[0] != '\n') {
- strcpy(the_command,console_buffer);
- flag_repeat = 1;
- }
- else {
- do_repeat = 1;
- }
- }
+ strcpy(the_command,console_buffer);
i->p = the_command;
- }
- else {
+ } else {
if (console_buffer[0] != '\n') {
if (strlen(the_command) + strlen(console_buffer)
< CONFIG_CBSIZE) {
@@ -1074,7 +1053,6 @@ static void get_user_input(struct in_str *i)
else {
the_command[0] = '\n';
the_command[1] = '\0';
- flag_repeat = 0;
}
}
if (i->__promptme == 0) {
@@ -1541,7 +1519,7 @@ static int run_pipe_real(struct pipe *pi)
# endif
#else
int nextin;
- int flag = do_repeat ? CMD_FLAG_REPEAT : 0;
+ int flag = 0;
struct child_prog *child;
cmd_tbl_t *cmdtp;
char *p;
@@ -1648,17 +1626,7 @@ static int run_pipe_real(struct pipe *pi)
* things seem to work with glibc. */
setup_redirects(child, squirrel);
#else
- /* check ";", because ,example , argv consist from
- * "help;flinfo" must not execute
- */
- if (strchr(child->argv[i], ';')) {
- printf ("Unknown command '%s' - try 'help' or use 'run' command\n",
- child->argv[i]);
- return -1;
- }
/* Look up command in command table */
-
-
if ((cmdtp = find_cmd(child->argv[i])) == NULL) {
printf ("Unknown command '%s' - try 'help'\n", child->argv[i]);
return -1; /* give up after bad command */
@@ -1689,10 +1657,7 @@ static int run_pipe_real(struct pipe *pi)
#else
/* OK - call function to do the command */
- rcode = (cmdtp->cmd)
-(cmdtp, flag,child->argc-i,&child->argv[i]);
- if ( !cmdtp->repeatable )
- flag_repeat = 0;
+ rcode = cmdtp->cmd(cmdtp, flag,child->argc-i,&child->argv[i]);
#endif
@@ -1806,9 +1771,6 @@ static int run_list_real(struct pipe *pi)
rpipe->r_mode == RES_FOR) &&
(rpipe->next == NULL)) {
syntax();
-#ifdef __U_BOOT__
- flag_repeat = 0;
-#endif
return 1;
}
if ((rpipe->r_mode == RES_IN &&
@@ -1817,9 +1779,6 @@ static int run_list_real(struct pipe *pi)
(rpipe->r_mode == RES_FOR &&
rpipe->next->r_mode != RES_IN)) {
syntax();
-#ifdef __U_BOOT__
- flag_repeat = 0;
-#endif
return 1;
}
}
@@ -1828,10 +1787,8 @@ static int run_list_real(struct pipe *pi)
pi->r_mode == RES_FOR) {
#ifdef __U_BOOT__
/* check Ctrl-C */
- ctrlc();
- if ((had_ctrlc())) {
+ if (ctrlc())
return 1;
- }
#endif
flag_restore = 0;
if (!rpipe) {
@@ -2151,8 +2108,6 @@ static char *get_dollar_var(char ch);
/* This is used to get/check local shell variables */
static char *get_local_var(const char *s)
{
- struct variables *cur;
-
if (!s)
return NULL;
@@ -2160,20 +2115,7 @@ static char *get_local_var(const char *s)
if (*s == '$')
return get_dollar_var(s[1]);
#endif
-#if 0
- if (strchr(s, '.')) {
- char *dev = strdup(s);
- char *par = strchr(str, '.');
- *par = 0;
- par++;
- do_get_param(dev, par);
- free(dev);
- }
-#endif
- for (cur = top_vars; cur; cur=cur->next)
- if(strcmp(cur->name, s)==0)
- return cur->value;
- return NULL;
+ return getenv(s);
}
/* This is used to set local shell variables
@@ -2183,8 +2125,6 @@ static char *get_local_var(const char *s)
static int set_local_var(const char *s, int flg_export)
{
char *name, *value;
- int result=0;
- struct variables *cur;
#ifdef __U_BOOT__
/* might be possible! */
@@ -2192,16 +2132,8 @@ static int set_local_var(const char *s, int flg_export)
return -1;
#endif
- name=strdup(s);
+ name = strdup(s);
-#ifdef __U_BOOT__
- if (getenv(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' */
@@ -2212,65 +2144,10 @@ static int set_local_var(const char *s, int flg_export)
}
*value++ = 0;
- for(cur = top_vars; cur; cur = cur->next) {
- if(strcmp(cur->name, name)==0)
- break;
- }
-
- if(cur) {
- if(strcmp(cur->value, value)==0) {
- if(flg_export>0 && cur->flg_export==0)
- cur->flg_export=flg_export;
- else
- result++;
- } else {
- if(cur->flg_read_only) {
- error_msg("%s: readonly variable", name);
- result = -1;
- } else {
- if(flg_export>0 || cur->flg_export>1)
- cur->flg_export=1;
- free(cur->value);
-
- cur->value = strdup(value);
- }
- }
- } else {
- cur = malloc(sizeof(struct variables));
- if(!cur) {
- result = -1;
- } else {
- cur->name = strdup(name);
- if(cur->name == 0) {
- free(cur);
- result = -1;
- } else {
- struct variables *bottom = top_vars;
- cur->value = strdup(value);
- cur->next = 0;
- cur->flg_export = flg_export;
- cur->flg_read_only = 0;
- while(bottom->next) bottom=bottom->next;
- bottom->next = cur;
- }
- }
- }
-
-#ifndef __U_BOOT__
- if(result==0 && cur->flg_export==1) {
- *(value-1) = '=';
- result = putenv(name);
- } else {
-#endif
- free(name);
-#ifndef __U_BOOT__
- if(result>0) /* equivalent to previous set */
- result = 0;
- }
-#endif
- return result;
+ return setenv(name, value);
}
+
#ifndef __U_BOOT__
static void unset_local_var(const char *name)
{
@@ -2308,7 +2185,7 @@ static int is_assignment(const char *s)
if (!isalpha(*s)) return 0;
++s;
- while(isalnum(*s) || *s=='_') ++s;
+ while(isalnum(*s) || *s=='_' || *s=='.') ++s;
return *s=='=';
}
@@ -2507,8 +2384,7 @@ static int done_word(o_string *dest, struct p_context *ctx)
if (*s == '\\') s++;
cnt++;
}
- str = malloc(cnt);
- if (!str) return 1;
+ str = xmalloc(cnt);
if ( child->argv == NULL) {
child->argc=0;
}
@@ -2811,7 +2687,7 @@ static int handle_dollar(o_string *dest, struct p_context *ctx, struct in_str *i
if (isalpha(ch)) {
b_addchr(dest, SPECIAL_VAR_SYMBOL);
ctx->child->sp++;
- while(ch=b_peek(input),isalnum(ch) || ch=='_') {
+ while(ch=b_peek(input),isalnum(ch) || ch=='_' || ch=='.') {
b_getch(input);
b_addchr(dest,ch);
}
@@ -3095,8 +2971,7 @@ void mapset(const unsigned char *set, int code)
void update_ifs_map(void)
{
/* char *ifs and char map[256] are both globals. */
-#warning IFS is broken
-// ifs = (uchar *)getenv("IFS");
+ ifs = (uchar *)getenv("IFS");
ifs = NULL;
if (ifs == NULL) ifs=(uchar *)" \t\n";
/* Precompute a list of 'flow through' behavior so it can be treated
@@ -3134,14 +3009,8 @@ int parse_stream_outer(struct in_str *inp, int flag)
if (!(flag & FLAG_PARSE_SEMICOLON) || (flag & FLAG_REPARSING)) mapset((uchar *)";$&|", 0);
inp->promptmode=1;
rcode = parse_stream(&temp, &ctx, inp, '\n');
-#ifdef __U_BOOT__
- if (rcode == 1) flag_repeat = 0;
-#endif
if (rcode != 1 && ctx.old_flag != 0) {
syntax();
-#ifdef __U_BOOT__
- flag_repeat = 0;
-#endif
}
if (rcode != 1 && ctx.old_flag == 0) {
done_word(&temp, &ctx);
@@ -3160,8 +3029,6 @@ int parse_stream_outer(struct in_str *inp, int flag)
}
break;
}
- if (code == -1)
- flag_repeat = 0;
#endif
} else {
if (ctx.old_flag != 0) {
@@ -3228,42 +3095,6 @@ int parse_file_outer(void)
return rcode;
}
-#ifdef __U_BOOT__
-static void u_boot_hush_reloc(void)
-{
- unsigned long addr;
- struct reserved_combo *r;
- unsigned long reloc_off;
-
-#if 0
- reloc_off = gd->reloc_off;
-#else
- reloc_off = 0;
-#warning FIXME: This is broken on !ARM
-#endif
-
- for (r=reserved_list; r<reserved_list+NRES; r++) {
- addr = (ulong) (r->literal) + reloc_off;
- r->literal = (char *)addr;
- }
-}
-
-int u_boot_hush_start(void)
-{
- if (top_vars == NULL) {
- top_vars = malloc(sizeof(struct variables));
- top_vars->name = "HUSH_VERSION";
- top_vars->value = "0.01";
- top_vars->next = 0;
- top_vars->flg_export = 0;
- top_vars->flg_read_only = 1;
- u_boot_hush_reloc();
- }
- return 0;
-}
-
-#endif /* __U_BOOT__ */
-
#ifndef __U_BOOT__
/* Make sure we have a controlling tty. If we get started under a job
* aware app (like bash for example), make sure we are now in charge so