summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Dreyfus <manu@netbsd.org>2017-06-26 11:38:39 +0200
committerRoy Marples <roy@marples.name>2017-06-28 09:54:09 +0100
commitbfc5f6daa209807385ce73dd58446e6c31a84c23 (patch)
tree2eed57468b2d9a57ad162521c5a3d3aa21b27629
parente71c3a01d464c97fd543314487f009d894d76422 (diff)
downloadparpd-bfc5f6daa209807385ce73dd58446e6c31a84c23.tar.xz
Fix kqueue usage when forking in the background
Summary: NetBSD's kqueue(2) man page says "The queue is not inherited by a child created with fork(2)", which means the poll_fd needs to be reopen after forking in the background. This is done by calling eloop_requeue() after daemon(). Fixes T127. Tags: #parpd Maniphest Tasks: T127 Differential Revision: https://dev.marples.name/D123
-rw-r--r--parpd.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/parpd.c b/parpd.c
index a178696..dbf26c4 100644
--- a/parpd.c
+++ b/parpd.c
@@ -718,9 +718,17 @@ main(int argc, char **argv)
goto out;
}
- if (!fflag && daemon(0, 0) == -1) {
- syslog(LOG_ERR, "daemon: %m");
- goto out;
+ if (!fflag) {
+ if (daemon(0, 0) == -1) {
+ syslog(LOG_ERR, "daemon: %m");
+ goto out;
+ }
+
+ /* At least for kqueue, poll_fd gets invalidated by fork */
+ if (eloop_requeue(eloop) == -1) {
+ syslog(LOG_ERR, "eloop_requeue after fork: %m");
+ goto out;
+ }
}
opt = eloop_start(eloop, &sigset);