diff options
| author | Emmanuel Dreyfus <manu@netbsd.org> | 2017-06-26 11:38:39 +0200 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2017-06-28 09:54:09 +0100 |
| commit | bfc5f6daa209807385ce73dd58446e6c31a84c23 (patch) | |
| tree | 2eed57468b2d9a57ad162521c5a3d3aa21b27629 | |
| parent | e71c3a01d464c97fd543314487f009d894d76422 (diff) | |
| download | parpd-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.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -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); |
