svlogd: fix 'SEGV on uninitialized data' and make it honor TERM
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 6 May 2007 01:37:21 +0000 (01:37 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 6 May 2007 01:37:21 +0000 (01:37 -0000)
runit/svlogd.c

index c2cff96790d9693ad984e05dea4d5f311ca89468..4e9644fd5e61a78f4e729460d6472f3aae270bc4 100644 (file)
@@ -642,9 +642,11 @@ static int buffer_pread(int fd, char *s, unsigned len, struct taia *now)
                                trotate = dir[i].trotate;
                }
 
-       while (1) {
+       do {
                sigprocmask(SIG_UNBLOCK, blocked_sigset, NULL);
                iopause(&input, 1, &trotate, now);
+// TODO: do not unblock/block, but use sigpending after iopause
+// to see whether there was any sig? (one syscall less...)
                sigprocmask(SIG_BLOCK, blocked_sigset, NULL);
                i = ndelay_read(fd, s, len);
                if (i >= 0) break;
@@ -653,7 +655,7 @@ static int buffer_pread(int fd, char *s, unsigned len, struct taia *now)
                        break;
                }
                /* else: EAGAIN - normal, repeat silently */
-       }
+       } while (!exitasap);
 
        if (i > 0) {
                int cnt;
@@ -784,12 +786,12 @@ int svlogd_main(int argc, char **argv)
        ////if (buflen <= linemax) usage();
        fdwdir = xopen(".", O_RDONLY|O_NDELAY);
        coe(fdwdir);
-       dir = xmalloc(dirn * sizeof(struct logdir));
+       dir = xzalloc(dirn * sizeof(struct logdir));
        for (i = 0; i < dirn; ++i) {
                dir[i].fddir = -1;
                dir[i].fdcur = -1;
                ////dir[i].btmp = xmalloc(buflen);
-               dir[i].ppid = 0;
+               /*dir[i].ppid = 0;*/
        }
        /* line = xmalloc(linemax + (timestamp ? 26 : 0)); */
        fndir = argv;