[hackers] [PATCH][ubase] respawn: reopen the fifo at end of line, and use read-only

From: Mattias Andrée <maandree_AT_kth.se>
Date: Sun, 25 Sep 2016 12:24:17 +0200

Signed-off-by: Mattias Andrée <maandree_AT_kth.se>
---
 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.0
Received 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