[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