diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-01-04 11:37:09 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-01-04 11:37:09 +0100 |
commit | a4899efd03d2fdaaf3f581d89a7a4844832d3fbb (patch) | |
tree | 8fab20ee4e6503866945de3bb400eadf9618b7ac | |
parent | 4168fdd8e6f5ad4d41a30a2350dbd635cc0fa6e1 (diff) | |
download | busybox-w32-a4899efd03d2fdaaf3f581d89a7a4844832d3fbb.tar.gz busybox-w32-a4899efd03d2fdaaf3f581d89a7a4844832d3fbb.tar.bz2 busybox-w32-a4899efd03d2fdaaf3f581d89a7a4844832d3fbb.zip |
hush: fix exitcodes of killed processes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/hush.c | 6 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/sig_exitcode.right | 5 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/sig_exitcode.tests | 9 |
3 files changed, 18 insertions, 2 deletions
diff --git a/shell/hush.c b/shell/hush.c index 3044024a0..25094654d 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -3896,9 +3896,7 @@ static int checkjobs(struct pipe* fg_pipe) | |||
3896 | fg_pipe->alive_cmds--; | 3896 | fg_pipe->alive_cmds--; |
3897 | if (i == fg_pipe->num_cmds - 1) { | 3897 | if (i == fg_pipe->num_cmds - 1) { |
3898 | /* last process gives overall exitstatus */ | 3898 | /* last process gives overall exitstatus */ |
3899 | /* Note: is WIFSIGNALED, WEXITSTATUS = sig + 128 */ | ||
3900 | rcode = WEXITSTATUS(status); | 3899 | rcode = WEXITSTATUS(status); |
3901 | IF_HAS_KEYWORDS(if (fg_pipe->pi_inverted) rcode = !rcode;) | ||
3902 | /* bash prints killer signal's name for *last* | 3900 | /* bash prints killer signal's name for *last* |
3903 | * process in pipe (prints just newline for SIGINT). | 3901 | * process in pipe (prints just newline for SIGINT). |
3904 | * Mimic this. Example: "sleep 5" + (^\ or kill -QUIT) | 3902 | * Mimic this. Example: "sleep 5" + (^\ or kill -QUIT) |
@@ -3906,7 +3904,11 @@ static int checkjobs(struct pipe* fg_pipe) | |||
3906 | if (WIFSIGNALED(status)) { | 3904 | if (WIFSIGNALED(status)) { |
3907 | int sig = WTERMSIG(status); | 3905 | int sig = WTERMSIG(status); |
3908 | printf("%s\n", sig == SIGINT ? "" : get_signame(sig)); | 3906 | printf("%s\n", sig == SIGINT ? "" : get_signame(sig)); |
3907 | /* TODO: MIPS has 128 sigs (1..128), what if sig==128 here? | ||
3908 | * Maybe we need to use sig | 128? */ | ||
3909 | rcode = sig + 128; | ||
3909 | } | 3910 | } |
3911 | IF_HAS_KEYWORDS(if (fg_pipe->pi_inverted) rcode = !rcode;) | ||
3910 | } | 3912 | } |
3911 | } else { | 3913 | } else { |
3912 | fg_pipe->cmds[i].is_stopped = 1; | 3914 | fg_pipe->cmds[i].is_stopped = 1; |
diff --git a/shell/hush_test/hush-misc/sig_exitcode.right b/shell/hush_test/hush-misc/sig_exitcode.right new file mode 100644 index 000000000..d5f000a08 --- /dev/null +++ b/shell/hush_test/hush-misc/sig_exitcode.right | |||
@@ -0,0 +1,5 @@ | |||
1 | KILL | ||
2 | 137:137 | ||
3 | KILL | ||
4 | 0:0 | ||
5 | Done | ||
diff --git a/shell/hush_test/hush-misc/sig_exitcode.tests b/shell/hush_test/hush-misc/sig_exitcode.tests new file mode 100755 index 000000000..7879dc854 --- /dev/null +++ b/shell/hush_test/hush-misc/sig_exitcode.tests | |||
@@ -0,0 +1,9 @@ | |||
1 | exec 2>&1 | ||
2 | |||
3 | $THIS_SH -c 'kill -9 $$' | ||
4 | echo 137:$? | ||
5 | |||
6 | ! $THIS_SH -c 'kill -9 $$' | ||
7 | echo 0:$? | ||
8 | |||
9 | echo Done | ||