diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-04-06 18:40:31 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-04-06 18:40:31 +0000 |
commit | 0e15138c03db5ac6b68ac24a074bf1c1532cbe1e (patch) | |
tree | 0f8806b8ebc01be3fe33541c01864655bb6c6f3b /shell | |
parent | 4ed67dd3d5a042470c6bc04723c2a0a37ca072b7 (diff) | |
download | busybox-0e15138c03db5ac6b68ac24a074bf1c1532cbe1e.tar.gz |
hush: fix "if false; then...fi" exitcode;
trim "keyword"-less hush by 10 bytes
Diffstat (limited to 'shell')
-rw-r--r-- | shell/hush.c | 13 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/if_false_exitcode.right | 1 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/if_false_exitcode.tests | 2 |
3 files changed, 12 insertions, 4 deletions
diff --git a/shell/hush.c b/shell/hush.c index c74d10c1b..c563cfe33 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -3038,8 +3038,10 @@ static int run_list(struct pipe *pi) #else enum { cond_code = 0 }; #endif +#if HAS_KEYWORDS smallint rword; /* enum reserved_style */ smallint last_rword; /* ditto */ +#endif debug_printf_exec("run_list start lvl %d\n", G.run_list_level + 1); @@ -3118,10 +3120,12 @@ static int run_list(struct pipe *pi) } #endif /* JOB */ - rcode = G.last_return_code; +#if HAS_KEYWORDS rword = RES_NONE; last_rword = RES_XXXX; +#endif last_followup = PIPE_SEQ; + rcode = G.last_return_code; /* Go through list of pipes, (maybe) executing them. */ for (; pi; pi = USE_HUSH_LOOPS(rword == RES_DONE ? loop_top : ) pi->next) { @@ -3129,7 +3133,6 @@ static int run_list(struct pipe *pi) break; IF_HAS_KEYWORDS(rword = pi->res_word;) - IF_HAS_NO_KEYWORDS(rword = RES_NONE;) debug_printf_exec(": rword=%d cond_code=%d last_rword=%d\n", rword, cond_code, last_rword); #if ENABLE_HUSH_LOOPS @@ -3142,7 +3145,7 @@ static int run_list(struct pipe *pi) } #endif /* Still in the same "if...", "then..." or "do..." branch? */ - if (rword == last_rword) { + if (IF_HAS_KEYWORDS(rword == last_rword &&) 1) { if ((rcode == 0 && last_followup == PIPE_OR) || (rcode != 0 && last_followup == PIPE_AND) ) { @@ -3154,10 +3157,12 @@ static int run_list(struct pipe *pi) } } last_followup = pi->followup; - last_rword = rword; + IF_HAS_KEYWORDS(last_rword = rword;) #if ENABLE_HUSH_IF if (cond_code) { if (rword == RES_THEN) { + /* if false; then ... fi has exitcode 0! */ + G.last_return_code = rcode = EXIT_SUCCESS; /* "if <false> THEN cmd": skip cmd */ continue; } diff --git a/shell/hush_test/hush-misc/if_false_exitcode.right b/shell/hush_test/hush-misc/if_false_exitcode.right new file mode 100644 index 000000000..7b24a35ff --- /dev/null +++ b/shell/hush_test/hush-misc/if_false_exitcode.right @@ -0,0 +1 @@ +Ok:0 diff --git a/shell/hush_test/hush-misc/if_false_exitcode.tests b/shell/hush_test/hush-misc/if_false_exitcode.tests new file mode 100755 index 000000000..01b36b100 --- /dev/null +++ b/shell/hush_test/hush-misc/if_false_exitcode.tests @@ -0,0 +1,2 @@ +if false; then echo Bad; fi +echo Ok:$? |