From: Karel Zak Date: Wed, 5 Sep 2018 09:51:22 +0000 (+0200) Subject: script: be sensitive to another SIGCHLD ssi_codes X-Git-Tag: v2.33-rc1~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=27afe5016842c22d256ea9f88b598d637ca0df84;p=thirdparty%2Futil-linux.git script: be sensitive to another SIGCHLD ssi_codes The current signalfd handler cares on CLD_EXITED only. It's pretty insufficient as there is more situations (and codes) when child no more running. Addresses: https://github.com/karelzak/util-linux/issues/686 Signed-off-by: Karel Zak --- diff --git a/term-utils/script.c b/term-utils/script.c index 6d5ddd84a2..7692f91e2b 100644 --- a/term-utils/script.c +++ b/term-utils/script.c @@ -477,10 +477,15 @@ static void handle_signal(struct script_control *ctl, int fd) switch (info.ssi_signo) { case SIGCHLD: - DBG(SIGNAL, ul_debug(" get signal SIGCHLD")); - if (info.ssi_code == CLD_EXITED) { + DBG(SIGNAL, ul_debug(" get signal SIGCHLD [ssi_code=%d, ssi_status=%d]", + info.ssi_code, info.ssi_status)); + if (info.ssi_code == CLD_EXITED + || info.ssi_code == CLD_KILLED + || info.ssi_code == CLD_DUMPED) { wait_for_child(ctl, 0); ctl->poll_timeout = 10; + + /* In case of ssi_code is CLD_TRAPPED, CLD_STOPPED, or CLD_CONTINUED */ } else if (info.ssi_status == SIGSTOP && ctl->child) { DBG(SIGNAL, ul_debug(" child stop by SIGSTOP -- stop parent too")); kill(getpid(), SIGSTOP); @@ -508,6 +513,7 @@ static void handle_signal(struct script_control *ctl, int fd) default: abort(); } + DBG(SIGNAL, ul_debug("signal handle on FD %d done", fd)); } static void do_io(struct script_control *ctl)