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:
M | respawn.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)