From 032228c9af6fbda5177c47c3d410386895957555 Mon Sep 17 00:00:00 2001 From: Andreas Henriksson Date: Tue, 14 Oct 2014 12:07:21 +0200 Subject: [PATCH] script: may be hangs Signed-off-by: Karel Zak --- term-utils/script.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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; -- 2.47.2