aboutsummaryrefslogtreecommitdiff
path: root/runit
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-02-03 00:52:17 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-02-03 00:52:17 +0000
commit4f8d27f29a29db6afd0fbb941c00d4eaee860e90 (patch)
tree96f7a1582856b9166d1bdb5f7c2a66c5aa13149e /runit
parent493691a4f5023097b909aa8a443bb45dd9d9a68c (diff)
downloadbusybox-w32-4f8d27f29a29db6afd0fbb941c00d4eaee860e90.tar.gz
busybox-w32-4f8d27f29a29db6afd0fbb941c00d4eaee860e90.tar.bz2
busybox-w32-4f8d27f29a29db6afd0fbb941c00d4eaee860e90.zip
svlogd: do not set O_NONBLOCK on stdin permanently - that can
affect other processes!
Diffstat (limited to 'runit')
-rw-r--r--runit/svlogd.c72
1 files changed, 44 insertions, 28 deletions
diff --git a/runit/svlogd.c b/runit/svlogd.c
index 59b1e5721..a0e562b21 100644
--- a/runit/svlogd.c
+++ b/runit/svlogd.c
@@ -44,15 +44,19 @@ static int wstat;
44static struct taia trotate; 44static struct taia trotate;
45 45
46static char *line; 46static char *line;
47static unsigned exitasap; 47static smallint exitasap;
48static unsigned rotateasap; 48static smallint rotateasap;
49static unsigned reopenasap; 49static smallint reopenasap;
50static unsigned linecomplete = 1; 50static smallint linecomplete = 1;
51static unsigned tmaxflag; 51
52static iopause_fd input; 52static smallint tmaxflag;
53 53
54static const char *replace = "";
55static char repl; 54static char repl;
55static const char *replace = "";
56
57sigset_t blocked_sigset;
58static iopause_fd input;
59static int fl_flag_0;
56 60
57static struct logdir { 61static struct logdir {
58//// char *btmp; 62//// char *btmp;
@@ -333,7 +337,7 @@ static int buffer_pwrite(int n, char *s, unsigned len)
333 if (len > (ld->sizemax - ld->size)) 337 if (len > (ld->sizemax - ld->size))
334 len = ld->sizemax - ld->size; 338 len = ld->sizemax - ld->size;
335 } 339 }
336 while ((i = write(ld->fdcur, s, len)) == -1) { 340 while ((i = full_write(ld->fdcur, s, len)) == -1) {
337 if ((errno == ENOSPC) && (ld->nmin < ld->nmax)) { 341 if ((errno == ENOSPC) && (ld->nmin < ld->nmax)) {
338 DIR *d; 342 DIR *d;
339 struct dirent *f; 343 struct dirent *f;
@@ -585,6 +589,17 @@ static void logdirs_reopen(void)
585 if (!ok) fatalx("no functional log directories"); 589 if (!ok) fatalx("no functional log directories");
586} 590}
587 591
592/* Will look good in libbb one day */
593static ssize_t ndelay_read(int fd, void *buf, size_t count)
594{
595 if (!(fl_flag_0 & O_NONBLOCK))
596 fcntl(fd, F_SETFL, fl_flag_0 | O_NONBLOCK);
597 count = safe_read(fd, buf, count);
598 if (!(fl_flag_0 & O_NONBLOCK))
599 fcntl(fd, F_SETFL, fl_flag_0);
600 return count;
601}
602
588/* Used for reading stdin */ 603/* Used for reading stdin */
589static int buffer_pread(int fd, char *s, unsigned len) 604static int buffer_pread(int fd, char *s, unsigned len)
590{ 605{
@@ -617,17 +632,10 @@ static int buffer_pread(int fd, char *s, unsigned len)
617 } 632 }
618 633
619 while (1) { 634 while (1) {
620 /* Comment? */ 635 sigprocmask(SIG_UNBLOCK, &blocked_sigset, NULL);
621 sig_unblock(SIGTERM);
622 sig_unblock(SIGCHLD);
623 sig_unblock(SIGALRM);
624 sig_unblock(SIGHUP);
625 iopause(&input, 1, &trotate, &now); 636 iopause(&input, 1, &trotate, &now);
626 sig_block(SIGTERM); 637 sigprocmask(SIG_BLOCK, &blocked_sigset, NULL);
627 sig_block(SIGCHLD); 638 i = ndelay_read(fd, s, len);
628 sig_block(SIGALRM);
629 sig_block(SIGHUP);
630 i = safe_read(fd, s, len);
631 if (i >= 0) break; 639 if (i >= 0) break;
632 if (errno != EAGAIN) { 640 if (errno != EAGAIN) {
633 warn("cannot read standard input"); 641 warn("cannot read standard input");
@@ -775,14 +783,17 @@ int svlogd_main(int argc, char **argv)
775 fndir = argv; 783 fndir = argv;
776 input.fd = 0; 784 input.fd = 0;
777 input.events = IOPAUSE_READ; 785 input.events = IOPAUSE_READ;
778 /* I be damned. Linux 2.6.18: this somehow affects 786 /* We cannot set NONBLOCK on fd #0 permanently - this setting
779 * OTHER processes! Konsole starts to redraw itself much slower! 787 * _isn't_ per-process! It is shared among all other processes
780 * This persists even after svlogd exits */ 788 * with the same stdin */
781 ndelay_on(input.fd); 789 fl_flag_0 = fcntl(0, F_GETFL, 0);
782 sig_block(SIGTERM); 790
783 sig_block(SIGCHLD); 791 sigemptyset(&blocked_sigset);
784 sig_block(SIGALRM); 792 sigaddset(&blocked_sigset, SIGTERM);
785 sig_block(SIGHUP); 793 sigaddset(&blocked_sigset, SIGCHLD);
794 sigaddset(&blocked_sigset, SIGALRM);
795 sigaddset(&blocked_sigset, SIGHUP);
796 sigprocmask(SIG_BLOCK, &blocked_sigset, NULL);
786 sig_catch(SIGTERM, sig_term_handler); 797 sig_catch(SIGTERM, sig_term_handler);
787 sig_catch(SIGCHLD, sig_child_handler); 798 sig_catch(SIGCHLD, sig_child_handler);
788 sig_catch(SIGALRM, sig_alarm_handler); 799 sig_catch(SIGALRM, sig_alarm_handler);
@@ -850,8 +861,13 @@ int svlogd_main(int argc, char **argv)
850 /* linelen == no of chars incl. '\n' (or == stdin_cnt) */ 861 /* linelen == no of chars incl. '\n' (or == stdin_cnt) */
851 ch = lineptr[linelen-1]; 862 ch = lineptr[linelen-1];
852 863
853 /* write out lineptr[0..linelen-1] to each log destination */ 864 /* TODO: biggest performance hit is coming from the fact
854 /* (or lineptr[-26..linelen-1] if timestamping) */ 865 * that we do not buffer writes. We may read many lines
866 * in one read() above, but will do one write()
867 * per line below. Should we use stdio? */
868
869 /* write out lineptr[0..linelen-1] to each log destination
870 * (or lineptr[-26..linelen-1] if timestamping) */
855 printlen = linelen; 871 printlen = linelen;
856 printptr = lineptr; 872 printptr = lineptr;
857 if (timestamp) { 873 if (timestamp) {