hush: fix exitcodes of killed processes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2010-01-04 11:37:09 +01:00
parent 4168fdd8e6
commit a4899efd03
3 changed files with 18 additions and 2 deletions

View File

@ -3896,9 +3896,7 @@ static int checkjobs(struct pipe* fg_pipe)
fg_pipe->alive_cmds--; fg_pipe->alive_cmds--;
if (i == fg_pipe->num_cmds - 1) { if (i == fg_pipe->num_cmds - 1) {
/* last process gives overall exitstatus */ /* last process gives overall exitstatus */
/* Note: is WIFSIGNALED, WEXITSTATUS = sig + 128 */
rcode = WEXITSTATUS(status); rcode = WEXITSTATUS(status);
IF_HAS_KEYWORDS(if (fg_pipe->pi_inverted) rcode = !rcode;)
/* bash prints killer signal's name for *last* /* bash prints killer signal's name for *last*
* process in pipe (prints just newline for SIGINT). * process in pipe (prints just newline for SIGINT).
* Mimic this. Example: "sleep 5" + (^\ or kill -QUIT) * Mimic this. Example: "sleep 5" + (^\ or kill -QUIT)
@ -3906,7 +3904,11 @@ static int checkjobs(struct pipe* fg_pipe)
if (WIFSIGNALED(status)) { if (WIFSIGNALED(status)) {
int sig = WTERMSIG(status); int sig = WTERMSIG(status);
printf("%s\n", sig == SIGINT ? "" : get_signame(sig)); printf("%s\n", sig == SIGINT ? "" : get_signame(sig));
/* TODO: MIPS has 128 sigs (1..128), what if sig==128 here?
* Maybe we need to use sig | 128? */
rcode = sig + 128;
} }
IF_HAS_KEYWORDS(if (fg_pipe->pi_inverted) rcode = !rcode;)
} }
} else { } else {
fg_pipe->cmds[i].is_stopped = 1; fg_pipe->cmds[i].is_stopped = 1;

View File

@ -0,0 +1,5 @@
KILL
137:137
KILL
0:0
Done

View File

@ -0,0 +1,9 @@
exec 2>&1
$THIS_SH -c 'kill -9 $$'
echo 137:$?
! $THIS_SH -c 'kill -9 $$'
echo 0:$?
echo Done