Introduction
Introduction Statistics Contact Development Disclaimer Help
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)
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.