summaryrefslogtreecommitdiff
path: root/runit/svlogd.c
diff options
context:
space:
mode:
authorDenis Vlasenko2007-05-06 01:37:21 +0000
committerDenis Vlasenko2007-05-06 01:37:21 +0000
commitb952835efe865a8303f69d7fdac75c7dc11265ce (patch)
tree78e99e0f85514518696299327d059e7e7eb7a465 /runit/svlogd.c
parentdd4cb2b31eabe5c69144dfb20fd08ebc625175b1 (diff)
downloadbusybox-b952835efe865a8303f69d7fdac75c7dc11265ce.zip
busybox-b952835efe865a8303f69d7fdac75c7dc11265ce.tar.gz
svlogd: fix 'SEGV on uninitialized data' and make it honor TERM
Diffstat (limited to 'runit/svlogd.c')
-rw-r--r--runit/svlogd.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/runit/svlogd.c b/runit/svlogd.c
index c2cff96..4e9644f 100644
--- a/runit/svlogd.c
+++ b/runit/svlogd.c
@@ -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;