summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/cli.c9
-rw-r--r--common/cli_hush.c3
-rw-r--r--include/cli_hush.h1
-rw-r--r--include/command.h1
-rw-r--r--test/command_ut.c14
5 files changed, 24 insertions, 4 deletions
diff --git a/common/cli.c b/common/cli.c
index 272b0288d7..075ae9dc4a 100644
--- a/common/cli.c
+++ b/common/cli.c
@@ -36,8 +36,11 @@ int run_command(const char *cmd, int flag)
return 0;
#else
- return parse_string_outer(cmd,
- FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
+ int hush_flags = FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP;
+
+ if (flag & CMD_FLAG_ENV)
+ hush_flags |= FLAG_CONT_ON_NEWLINE;
+ return parse_string_outer(cmd, hush_flags);
#endif
}
@@ -125,7 +128,7 @@ int do_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return 1;
}
- if (run_command(arg, flag) != 0)
+ if (run_command(arg, flag | CMD_FLAG_ENV) != 0)
return 1;
}
return 0;
diff --git a/common/cli_hush.c b/common/cli_hush.c
index 38da5a09fa..2b654b754f 100644
--- a/common/cli_hush.c
+++ b/common/cli_hush.c
@@ -3170,7 +3170,8 @@ static int parse_stream_outer(struct in_str *inp, int flag)
update_ifs_map();
if (!(flag & FLAG_PARSE_SEMICOLON) || (flag & FLAG_REPARSING)) mapset((uchar *)";$&|", 0);
inp->promptmode=1;
- rcode = parse_stream(&temp, &ctx, inp, '\n');
+ rcode = parse_stream(&temp, &ctx, inp,
+ flag & FLAG_CONT_ON_NEWLINE ? -1 : '\n');
#ifdef __U_BOOT__
if (rcode == 1) flag_repeat = 0;
#endif
diff --git a/include/cli_hush.h b/include/cli_hush.h
index 4951eef572..57c870dfe9 100644
--- a/include/cli_hush.h
+++ b/include/cli_hush.h
@@ -11,6 +11,7 @@
#define FLAG_EXIT_FROM_LOOP 1
#define FLAG_PARSE_SEMICOLON (1 << 1) /* symbol ';' is special for parser */
#define FLAG_REPARSING (1 << 2) /* >=2nd pass */
+#define FLAG_CONT_ON_NEWLINE (1 << 3) /* continue when we see \n */
extern int u_boot_hush_start(void);
extern int parse_string_outer(const char *, int);
diff --git a/include/command.h b/include/command.h
index 6f06db1cc3..bd3fc049ec 100644
--- a/include/command.h
+++ b/include/command.h
@@ -147,6 +147,7 @@ int cmd_process(int flag, int argc, char * const argv[],
*/
#define CMD_FLAG_REPEAT 0x0001 /* repeat last command */
#define CMD_FLAG_BOOTD 0x0002 /* command is from bootd */
+#define CMD_FLAG_ENV 0x0004 /* command is from the environment */
#ifdef CONFIG_AUTO_COMPLETE
# define _CMD_COMPLETE(x) x,
diff --git a/test/command_ut.c b/test/command_ut.c
index ae6466d0ed..e136075541 100644
--- a/test/command_ut.c
+++ b/test/command_ut.c
@@ -66,7 +66,21 @@ static int do_ut_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
assert(run_command_list("false", -1, 0) == 1);
assert(run_command_list("echo", -1, 0) == 0);
+ run_command("setenv foo 'setenv monty 1; setenv python 2'", 0);
+ run_command("run foo", 0);
+ assert(getenv("monty") != NULL);
+ assert(!strcmp("1", getenv("monty")));
+ assert(getenv("python") != NULL);
+ assert(!strcmp("2", getenv("python")));
+
#ifdef CONFIG_SYS_HUSH_PARSER
+ run_command("setenv foo 'setenv black 1\nsetenv adder 2'", 0);
+ run_command("run foo", 0);
+ assert(getenv("black") != NULL);
+ assert(!strcmp("1", getenv("black")));
+ assert(getenv("adder") != NULL);
+ assert(!strcmp("2", getenv("adder")));
+
/* Test the 'test' command */
#define HUSH_TEST(name, expr, expected_result) \
OpenPOWER on IntegriCloud