f7eb6dd
From: "Matwey V. Kornilov" <matwey.kornilov@gmail.com>
f7eb6dd
Date: Tue, 17 Dec 2013 18:16:56 +0400
f7eb6dd
Subject: [PATCH] Add -systemd option to empd. Check for include
f7eb6dd
 systemd/sd-daemon.h and wrap systemd code into ifdef-s.
f7eb6dd
f7eb6dd
f7eb6dd
diff --git a/erts/configure.in b/erts/configure.in
f7eb6dd
index 9ad3671..125e579 100644
f7eb6dd
--- a/erts/configure.in
f7eb6dd
+++ b/erts/configure.in
f7eb6dd
@@ -1565,6 +1565,8 @@ AC_CHECK_MEMBERS([struct ifreq.ifr_enaddr], [], [],
f7eb6dd
 	 #endif
f7eb6dd
 	])
f7eb6dd
 
f7eb6dd
+AC_CHECK_HEADERS(systemd/sd-daemon.h)
f7eb6dd
+
f7eb6dd
 dnl ----------------------------------------------------------------------
f7eb6dd
 dnl Check the availability for libdlpi
f7eb6dd
 dnl ----------------------------------------------------------------------
f7eb6dd
diff --git a/erts/epmd/src/epmd.c b/erts/epmd/src/epmd.c
f7eb6dd
index 2d55b37..fc58882 100644
f7eb6dd
--- a/erts/epmd/src/epmd.c
f7eb6dd
+++ b/erts/epmd/src/epmd.c
f7eb6dd
@@ -175,6 +175,9 @@ int main(int argc, char** argv)
f7eb6dd
     g->nodes.reg = g->nodes.unreg = g->nodes.unreg_tail = NULL;
f7eb6dd
     g->nodes.unreg_count = 0;
f7eb6dd
     g->active_conn    = 0;
f7eb6dd
+#ifdef HAVE_SYSTEMD_SD_DAEMON_H
f7eb6dd
+    g->is_systemd     = 0;
f7eb6dd
+#endif
f7eb6dd
 
f7eb6dd
     for (i = 0; i < MAX_LISTEN_SOCKETS; i++)
f7eb6dd
 	g->listenfd[i] = -1;
f7eb6dd
@@ -248,8 +251,12 @@ int main(int argc, char** argv)
f7eb6dd
 	    else
f7eb6dd
 		usage(g);
f7eb6dd
 	    epmd_cleanup_exit(g,0);
f7eb6dd
-	}
f7eb6dd
-	else
f7eb6dd
+#ifdef HAVE_SYSTEMD_SD_DAEMON_H
f7eb6dd
+	} else if (strcmp(argv[0], "-systemd") == 0) {
f7eb6dd
+            g->is_systemd = 1;
f7eb6dd
+            argv++; argc--;
f7eb6dd
+#endif
f7eb6dd
+	} else
f7eb6dd
 	    usage(g);
f7eb6dd
     }
f7eb6dd
     dbg_printf(g,1,"epmd running - daemon = %d",g->is_daemon);
f7eb6dd
@@ -454,6 +461,11 @@ static void usage(EpmdVars *g)
f7eb6dd
     fprintf(stderr, "        Forcibly unregisters a name with epmd\n");
f7eb6dd
     fprintf(stderr, "        (only allowed if -relaxed_command_check was given when \n");
f7eb6dd
     fprintf(stderr, "        epmd was started).\n");
f7eb6dd
+#ifdef HAVE_SYSTEMD_SD_DAEMON_H
f7eb6dd
+    fprintf(stderr, "    -systemd\n");
f7eb6dd
+    fprintf(stderr, "        Wait for socket from systemd. The option makes sense\n");
f7eb6dd
+    fprintf(stderr, "        when started from .socket unit.\n");
f7eb6dd
+#endif
f7eb6dd
     epmd_cleanup_exit(g,1);
f7eb6dd
 }
f7eb6dd
 
f7eb6dd
diff --git a/erts/epmd/src/epmd_int.h b/erts/epmd/src/epmd_int.h
f7eb6dd
index 656dbd1..bf1ddd8 100644
f7eb6dd
--- a/erts/epmd/src/epmd_int.h
f7eb6dd
+++ b/erts/epmd/src/epmd_int.h
f7eb6dd
@@ -321,6 +321,9 @@ typedef struct {
f7eb6dd
   int listenfd[MAX_LISTEN_SOCKETS];
f7eb6dd
   char *addresses;
f7eb6dd
   char **argv;
f7eb6dd
+#ifdef HAVE_SYSTEMD_SD_DAEMON_H
f7eb6dd
+  int is_systemd;
f7eb6dd
+#endif
f7eb6dd
 } EpmdVars;
f7eb6dd
 
f7eb6dd
 void dbg_printf(EpmdVars*,int,const char*,...);