From: Andreas Henriksson Date: Tue, 14 Oct 2014 10:07:21 +0000 (+0200) Subject: script: may be hangs X-Git-Tag: v2.26-rc1~315 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=032228c;p=thirdparty%2Futil-linux.git script: may be hangs Signed-off-by: Karel Zak --- diff --git a/term-utils/script.c b/term-utils/script.c index 7d3787e96a..78d7a3049f 100644 --- a/term-utils/script.c +++ b/term-utils/script.c @@ -80,6 +80,7 @@ #define DEFAULT_OUTPUT "typescript" +void sig_finish(int); void finish(int); void done(void); void fail(void); @@ -258,7 +259,7 @@ main(int argc, char **argv) { /* setup SIGCHLD handler */ sigemptyset(&sa.sa_mask); sa.sa_flags = 0; - sa.sa_handler = finish; + sa.sa_handler = sig_finish; sigaction(SIGCHLD, &sa, NULL); /* init mask for SIGCHLD */ @@ -385,17 +386,18 @@ doinput(void) { } if (!die) - finish(0); /* wait for childern */ + finish(1); /* wait for children */ done(); } void -finish(int dummy __attribute__ ((__unused__))) { +finish(int wait) { int status; pid_t pid; int errsv = errno; + int options = wait ? 0 : WNOHANG; - while ((pid = wait3(&status, WNOHANG, 0)) > 0) + while ((pid = wait3(&status, options, 0)) > 0) if (pid == child) { childstatus = status; die = 1; @@ -404,6 +406,11 @@ finish(int dummy __attribute__ ((__unused__))) { errno = errsv; } +void +sig_finish(int dummy __attribute__ ((__unused__))) { + finish(0); +} + void resize(int dummy __attribute__ ((__unused__))) { resized = 1;