diff --git a/st.c b/st.c index 6f40e35..c15ca4b 100644 --- a/st.c +++ b/st.c @@ -712,19 +712,24 @@ execsh(char *cmd, char **args) void sigchld(int a) { - int stat; + int stat, olderrno; pid_t p; - if ((p = waitpid(pid, &stat, WNOHANG)) < 0) - die("waiting for pid %hd failed: %s\n", pid, strerror(errno)); + olderrno = errno; + do { + p = waitpid(pid, &stat, WNOHANG); + } while (p < 0 && errno == EINTR); - if (pid != p) + if (p < 0) + _exit(1); + + if (pid != p) { + errno = olderrno; return; + } - if (WIFEXITED(stat) && WEXITSTATUS(stat)) - die("child exited with status %d\n", WEXITSTATUS(stat)); - else if (WIFSIGNALED(stat)) - die("child terminated due to signal %d\n", WTERMSIG(stat)); + if ((WIFEXITED(stat) && WEXITSTATUS(stat)) || WIFSIGNALED(stat)) + _exit(1); _exit(0); }