$NetBSD: patch-sapi_fpm_fpm_events_port.c,v 1.1 2014/11/24 15:37:08 taca Exp $

Fix code to make FPM intercept signals properly even with pipes (via catch_workers_output=yes).
See https://bugs.php.net/bug.php?id=65800.
--- sapi/fpm/fpm/events/port.c.orig	2014-11-12 13:52:21.000000000 +0000
+++ sapi/fpm/fpm/events/port.c
@@ -124,6 +124,7 @@ static int fpm_event_port_wait(struct fp
 	t.tv_nsec = (timeout % 1000) * 1000 * 1000;
 
 	/* wait for inconming event or timeout. We want at least one event or timeout */
+again:
 	nget = 1;
 	ret = port_getn(pfd, events, nevents, &nget, &t);
 	if (ret < 0) {
@@ -133,17 +134,31 @@ static int fpm_event_port_wait(struct fp
 			zlog(ZLOG_WARNING, "poll() returns %d", errno);
 			return -1;
 		}
+
+		if (errno == EINTR)
+			goto again;
+
+		return 0;
 	}
 
 	for (i = 0; i < nget; i++) {
+		struct fpm_event_s *ev;
 
 		/* do we have a ptr to the event ? */
 		if (!events[i].portev_user) {
 			continue;
 		}
 
+		ev = (struct fpm_event_s *)events[i].portev_user;
+
+		if (port_associate(pfd, PORT_SOURCE_FD,
+		    ev->fd, POLLIN, (void *)ev) < 0) {
+			zlog(ZLOG_ERROR, "port: unable to add the event");
+			return -1;
+		}
+
 		/* fire the event */
-		fpm_event_fire((struct fpm_event_s *)events[i].portev_user);
+		fpm_event_fire(ev);
 
 		/* sanity check */
 		if (fpm_globals.parent_pid != getpid()) {
