[U-Boot] [PATCH] common, hush [BUG]: exit not work in hush shell
Heiko Schocher
hs at denx.de
Fri Sep 14 20:04:16 CEST 2012
running the following script in u-boot:
setenv error 'if true; then
echo **** ERROR ****
exit;
fi'
setenv foo echo "****************This should not be printed"
setenv loadubi
setenv updfs 'if true; then
echo; echo ========== Updating rootfs ==========; echo;
if run loadubi; then
echo ***************loadubi
else;
run error
fi
fi'
echo ========== start ==========
run updfs foo
echo **** end
with:
=> source 80008000
========== start ==========
========== Updating rootfs ==========
## Error: "loadubi" not defined
**** ERROR ****
****************This should not be printed
**** end
=>
should not continue after printing "**** ERROR ****", as exit should
skip the hole script. Fix this! I get with this patch:
=> source 80008000
========== start ==========
========== Updating rootfs ==========
## Error: "loadubi" not defined
**** ERROR ****
=>
Signed-off-by: Heiko Schocher <hs at denx.de>
Cc: Tom Rini <trini at ti.com>
Cc: Jeroen Hofstee <JHofstee at victronenergy.com>
---
common/cmd_source.c | 4 ++++
common/hush.c | 4 +++-
common/main.c | 7 ++++++-
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/common/cmd_source.c b/common/cmd_source.c
index c4cde98..0d54641 100644
--- a/common/cmd_source.c
+++ b/common/cmd_source.c
@@ -174,6 +174,10 @@ do_source (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
printf ("## Executing script at %08lx\n", addr);
rcode = source (addr, fit_uname);
+ if (rcode == -2) {
+ debug("Hit exit in script\n");
+ rcode = 0;
+ }
return rcode;
}
diff --git a/common/hush.c b/common/hush.c
index 4c84c2f..aa76fc7 100644
--- a/common/hush.c
+++ b/common/hush.c
@@ -3192,12 +3192,12 @@ int parse_stream_outer(struct in_str *inp, int flag)
code = run_list(ctx.list_head);
if (code == -2) { /* exit */
b_free(&temp);
- code = 0;
/* XXX hackish way to not allow exit from main loop */
if (inp->peek == file_peek) {
printf("exit not allowed from main input shell.\n");
continue;
}
+ flag |= FLAG_EXIT_FROM_LOOP;
break;
}
if (code == -1)
@@ -3222,6 +3222,8 @@ int parse_stream_outer(struct in_str *inp, int flag)
#ifndef __U_BOOT__
return 0;
#else
+ if (code == -2)
+ return -2;
return (code != 0) ? 1 : 0;
#endif /* __U_BOOT__ */
}
diff --git a/common/main.c b/common/main.c
index 81984ac..0cfb6e7 100644
--- a/common/main.c
+++ b/common/main.c
@@ -1469,6 +1469,7 @@ int run_command_list(const char *cmd, int len, int flag)
int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
{
int i;
+ int ret;
if (argc < 2)
return CMD_RET_USAGE;
@@ -1481,7 +1482,11 @@ int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
return 1;
}
- if (run_command(arg, flag) != 0)
+ ret = run_command(arg, flag);
+ /* in case we hit an exit in a script */
+ if (ret == -2)
+ return -2;
+ if (ret != 0)
return 1;
}
return 0;
--
1.7.7.6
More information about the U-Boot
mailing list