Browse Source

send PID of the main daemon to supervisor

  If running under systemd, notify the supervisor about current PID
of Tor daemon.  This makes systemd unit simpler and more robust:
it will do the right thing regardless of RunAsDaemon settings.
Tomasz Torcz 9 years ago
parent
commit
b17918726d
2 changed files with 18 additions and 4 deletions
  1. 3 4
      contrib/dist/tor.service.in
  2. 15 0
      src/or/config.c

+ 3 - 4
contrib/dist/tor.service.in

@@ -3,11 +3,10 @@ Description = Anonymizing overlay network for TCP
 After = syslog.target network.target nss-lookup.target
 
 [Service]
-Type = simple
+Type = notify
+NotifyAccess = all
 ExecStartPre = @BINDIR@/tor -f @CONFDIR@/torrc --verify-config
-# A torrc that has "RunAsDaemon 1" won't work with the "simple" service type;
-# let's explicitly override it.
-ExecStart = @BINDIR@/tor -f @CONFDIR@/torrc --RunAsDaemon 0
+ExecStart = @BINDIR@/tor -f @CONFDIR@/torrc 
 ExecReload = /bin/kill -HUP ${MAINPID}
 KillSignal = SIGINT
 TimeoutSec = 30

+ 15 - 0
src/or/config.c

@@ -55,6 +55,16 @@
 
 #include "procmon.h"
 
+#ifdef HAVE_SYSTEMD
+#   if defined(__COVERITY__) && !defined(__INCLUDE_LEVEL__)
+/* Systemd's use of gcc's __INCLUDE_LEVEL__ extension macro appears to confuse
+ * Coverity. Here's a kludge to unconfuse it.
+ */
+#   define __INCLUDE_LEVEL__ 2
+#   endif
+#include <systemd/sd-daemon.h>
+#endif
+
 /* From main.c */
 extern int quiet_level;
 
@@ -1018,6 +1028,11 @@ options_act_reversible(const or_options_t *old_options, char **msg)
     start_daemon();
   }
 
+#ifdef HAVE_SYSTEMD
+  /* Our PID may have changed, inform supervisor */
+  sd_notifyf(0, "MAINPID=%ld\n", (long int)getpid());
+#endif
+
 #ifndef HAVE_SYS_UN_H
   if (options->ControlSocket || options->ControlSocketsGroupWritable) {
     *msg = tor_strdup("Unix domain sockets (ControlSocket) not supported "