]> err.no Git - util-linux/commitdiff
script: dies on SIGWINCH
authorKarel Zak <kzak@redhat.com>
Fri, 5 Oct 2007 10:22:13 +0000 (12:22 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 5 Oct 2007 10:39:19 +0000 (12:39 +0200)
The "doinput" process doesn't make a difference between SIGWINCH and
SIGCHILD.  This process also sends unnecessary SIGWINCH to child (the
signal is ignored by child). Fixed.

Signed-off-by: Karel Zak <kzak@redhat.com>
misc-utils/script.c

index d3272df51dd5f33949ce9ceb0501e0146ea35494..3b957d8d7dbe052ee7873adb20a7cf499e7095bd 100644 (file)
@@ -99,6 +99,7 @@ int   tflg = 0;
 static char *progname;
 
 int die;
+int resized;
 
 static void
 die_if_link(char *fn) {
@@ -235,8 +236,14 @@ doinput() {
        if (die == 0 && child && kill(child, 0) == -1 && errno == ESRCH)
                die = 1;
 
-       while (die == 0 && (cc = read(0, ibuf, BUFSIZ)) > 0)
-               (void) write(master, ibuf, cc);
+       while (die == 0) {
+               if ((cc = read(0, ibuf, BUFSIZ)) > 0)
+                       (void) write(master, ibuf, cc);
+               else if (cc == -1 && errno == EINTR && resized)
+                       resized = 0;
+               else
+                       break;
+       }
 
        done();
 }
@@ -255,11 +262,10 @@ finish(int dummy) {
 
 void
 resize(int dummy) {
+       resized = 1;
        /* transmit window change information to the child */
        (void) ioctl(0, TIOCGWINSZ, (char *)&win);
        (void) ioctl(slave, TIOCSWINSZ, (char *)&win);
-
-       kill(child, SIGWINCH);
 }
 
 /*