Mark as a subreaper on FreeBSD (as for Linux).
authorDavin McCall <davmac@davmac.org>
Sat, 10 Feb 2018 19:59:51 +0000 (19:59 +0000)
committerDavin McCall <davmac@davmac.org>
Sat, 10 Feb 2018 20:18:10 +0000 (20:18 +0000)
This means double-forking processes become a child of Dinit rather than
PID 1 (in case they are different).

src/dinit.cc

index 94dc61f7165cd140d1a9348540e5677d02f2b618..67474eb4706d897436f142140dd07e3031ffa8c5 100644 (file)
@@ -17,6 +17,9 @@
 #include <sys/klog.h>
 #include <sys/reboot.h>
 #endif
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+#include <sys/procctl.h>
+#endif
 
 #include "dinit.h"
 #include "dasynq.h"
@@ -324,6 +327,12 @@ int dinit_main(int argc, char **argv)
     // orphaned child will re-parent to us rather than to PID 1 (although that could be us too).
     prctl(PR_SET_CHILD_SUBREAPER, 1);
 #endif
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+    // Documentation (man page) for this kind of sucks. PROC_REAP_ACQUIRE "acquires the reaper status for
+    // the current process" but does that mean the first two arguments still need valid values to be
+    // supplied? We'll play itself and explicitly target our own process:
+    procctl(P_PID, getpid(), PROC_REAP_ACQUIRE);
+#endif
     
     log_flush_timer.add_timer(event_loop, dasynq::clock_type::MONOTONIC);