]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
script: may be hangs
authorAndreas Henriksson <andreas@fatal.se>
Tue, 14 Oct 2014 10:07:21 +0000 (12:07 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 14 Oct 2014 10:07:21 +0000 (12:07 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
term-utils/script.c

index 7d3787e96a410403e9dac0c6520855865133d39e..78d7a3049f28d2ee6fb053795a73369a1a4b3097 100644 (file)
@@ -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;