Consolidate linux-specific code.
authorDavin McCall <davmac@davmac.org>
Tue, 4 Jul 2017 18:07:37 +0000 (19:07 +0100)
committerDavin McCall <davmac@davmac.org>
Tue, 4 Jul 2017 18:07:37 +0000 (19:07 +0100)
src/dinit.cc

index fa804eb90d544de94098625f8c8b15c7e591f066..ae859e004a49a3f0c272f1af953ead31bc5a5135 100644 (file)
@@ -14,6 +14,8 @@
 #include <pwd.h>
 #ifdef __linux__
 #include <sys/prctl.h>
+#include <sys/klog.h>
+#include <sys/reboot.h>
 #endif
 
 #include "dasynq.h"
 #include "dinit-log.h"
 #include "dinit-socket.h"
 
-#ifdef __linux__
-#include <sys/klog.h>
-#include <sys/reboot.h>
-#endif
-
 /*
  * When running as the system init process, Dinit processes the following signals:
  *
@@ -40,7 +37,6 @@
  * services even if the halt/reboot commands are unavailable for some reason.
  */
 
-
 using namespace dasynq;
 using eventloop_t = event_loop<null_mutex>;
 
@@ -223,10 +219,6 @@ int dinit_main(int argc, char **argv)
         if (twofd > 2) close(twofd);
     }
 
-#ifdef __linux__
-    prctl(PR_SET_CHILD_SUBREAPER, 1);
-#endif
-
     /* Set up signal handlers etc */
     /* SIG_CHILD is ignored by default: good */
     sigset_t sigwait_set;
@@ -305,6 +297,10 @@ int dinit_main(int argc, char **argv)
         // Make ctrl+alt+del combination send SIGINT to PID 1 (this process)
         reboot(RB_DISABLE_CAD);
     }
+
+    // Mark ourselves as a subreaper. This means that if a process we start double-forks, the
+    // 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
     
     /* start requested services */