--- respawn.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/respawn.c b/respawn.c index 77670f5..7fdd1ec 100644 --- a/respawn.c +++ b/respawn.c _AT_@ -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> _AT_@ -7,6 +6,7 @@ #include <errno.h> #include <fcntl.h> +#include <poll.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> _AT_@ -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': _AT_@ -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) -- 2.10.0Received on Sun Sep 25 2016 - 12:24:17 CEST
This archive was generated by hypermail 2.3.0 : Sun Sep 25 2016 - 12:36:16 CEST