diff options
author | Andreas Henriksson <andreas@fatal.se> | 2014-10-14 12:07:21 +0200 |
---|---|---|
committer | Karel Zak <kzak@redhat.com> | 2014-10-24 11:10:06 +0200 |
commit | 1e3f80099317bb18df3c474090b58a75813a29eb (patch) | |
tree | 02a8ec7d1965bdaf4eba841335d423f26c0cf5e0 | |
parent | 0d5bf499358959103ffab4f6bcd57a80156e0bf3 (diff) | |
download | util-linux-1e3f80099317bb18df3c474090b58a75813a29eb.tar.gz |
script: may be hangs
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | term-utils/script.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/term-utils/script.c b/term-utils/script.c index b9f87384a..b12b7fdb0 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; @@ -405,6 +407,11 @@ finish(int dummy __attribute__ ((__unused__))) { } void +sig_finish(int dummy __attribute__ ((__unused__))) { + finish(0); +} + +void resize(int dummy __attribute__ ((__unused__))) { resized = 1; } |