respawn: reopen the fifo at end of line, and use read-only - ubase - suckless l… | |
git clone git://git.suckless.org/ubase | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e3dacbb542daeda7797855b01b3afbf7c433ad5f | |
parent fa7ae96e0fc8963b0fdd179f0555b66c424555f4 | |
Author: Mattias Andrée <[email protected]> | |
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 <[email protected]> | |
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) |