ubase

suckless linux base utils
git clone git://git.2f30.org/ubase
Log | Files | Refs | README | LICENSE

commit e3dacbb542daeda7797855b01b3afbf7c433ad5f
parent fa7ae96e0fc8963b0fdd179f0555b66c424555f4
Author: Mattias Andrée <maandree@kth.se>
Date:   Sun, 25 Sep 2016 12:24:17 +0200

respawn: reopen the fifo at end of line, and use read-only

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
Mrespawn.c | 35+++++++++++++++++++++--------------
1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/respawn.c b/respawn.c @@ -1,5 +1,4 @@ /* See LICENSE file for copyright and license details. */ -#include <sys/select.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/types.h> @@ -7,6 +6,7 @@ #include <errno.h> #include <fcntl.h> +#include <poll.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> @@ -37,9 +37,9 @@ main(int argc, char *argv[]) pid_t pid; char buf[BUFSIZ]; int savederrno; - int fd; ssize_t n; - fd_set rdfd; + struct pollfd pollset[1]; + int polln; ARGBEGIN { case 'd': @@ -63,26 +63,33 @@ main(int argc, char *argv[]) signal(SIGTERM, sigterm); if (fifo) { - /* TODO: we should use O_RDONLY and re-open the fd on EOF */ - fd = open(fifo, O_RDWR | O_NONBLOCK); - if (fd < 0) + pollset->fd = open(fifo, O_RDONLY | O_NONBLOCK); + if (pollset->fd < 0) eprintf("open %s:", fifo); + pollset->events = POLLIN; } while (1) { if (fifo) { - FD_ZERO(&rdfd); - FD_SET(fd, &rdfd); - n = select(fd + 1, &rdfd, NULL, NULL, NULL); - if (n < 0) - eprintf("select:"); - if (n == 0 || FD_ISSET(fd, &rdfd) == 0) - continue; - while ((n = read(fd, buf, sizeof(buf))) > 0) + pollset->revents = 0; + polln = poll(pollset, 1, -1); + if (polln <= 0) { + if (polln == 0 || errno == EAGAIN) + continue; + eprintf("poll:"); + } + while ((n = read(pollset->fd, buf, sizeof(buf))) > 0) ; if (n < 0) if (errno != EAGAIN) eprintf("read %s:", fifo); + if (n == 0) { + close(pollset->fd); + pollset->fd = open(fifo, O_RDONLY | O_NONBLOCK); + if (pollset->fd < 0) + eprintf("open %s:", fifo); + pollset->events = POLLIN; + } } pid = fork(); if (pid < 0)