commit b3f54e290ae82dd8ee948c472b7eae061adff2c7
parent 833ca646e72dd27eaf8fb4f8b89d2279fd19a3f7
Author: Joris Vink <joris@coders.se>
Date:   Tue,  1 Feb 2022 10:34:12 +0100
Change parent behaviour when calling waitpid().
Wait for any process in our process group only instead of WAIT_ANY.
This allows the parent process to start subprocesses that end up
in different process groups which are handled in user code instead
completely (using signalfd for example).
Diffstat:
1 file changed, 17 insertions(+), 14 deletions(-)
diff --git a/src/worker.c b/src/worker.c
@@ -61,10 +61,6 @@
 #include "seccomp.h"
 #endif
 
-#if !defined(WAIT_ANY)
-#define WAIT_ANY		(-1)
-#endif
-
 #define WORKER_SOLO_COUNT	3
 
 #define WORKER(id)						\
@@ -92,6 +88,7 @@ static void		worker_accept_avail(struct kore_msg *, const void *);
 static void	worker_entropy_recv(struct kore_msg *, const void *);
 static void	worker_keymgr_response(struct kore_msg *, const void *);
 
+static pid_t				worker_pgrp;
 static int				accept_avail;
 static struct kore_worker		*kore_workers;
 static int				worker_no_lock;
@@ -153,6 +150,9 @@ kore_worker_init(void)
 	if (!kore_quiet)
 		kore_log(LOG_INFO, "starting worker processes");
 
+	if ((worker_pgrp = getpgrp()) == -1)
+		fatal("%s: getpgrp(): %s", __func__, errno_s);
+
 	/* Now start all the workers. */
 	id = 1;
 	cpu = 1;
@@ -647,19 +647,22 @@ kore_worker_reap(void)
 	pid_t			pid;
 	int			status;
 
-	pid = waitpid(WAIT_ANY, &status, WNOHANG);
+	for (;;) {
+		pid = waitpid(-worker_pgrp, &status, WNOHANG);
 
-	if (pid == -1) {
-		if (errno == ECHILD || errno == EINTR)
-			return;
-		kore_log(LOG_ERR, "%s: waitpid(): %s", __func__, errno_s);
-		return;
-	}
+		if (pid == -1) {
+			if (errno != ECHILD && errno != EINTR) {
+				kore_log(LOG_ERR,
+				    "%s: waitpid(): %s", __func__, errno_s);
+			}
+			break;
+		}
 
-	if (pid == 0)
-		return;
+		if (pid == 0)
+			break;
 
-	worker_reaper(pid, status);
+		worker_reaper(pid, status);
+	}
 }
 
 void