[PATCH] [RFC] Enable systemd socket activation

Łukasz Stelmach l.stelmach at samsung.com
Wed Jun 26 09:18:04 PDT 2013


Receive file descriptors of open sockets from systemd instead of
creating them.

Signed-off-by: Łukasz Stelmach <l.stelmach at samsung.com>
---
 Xtrans.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/Xtrans.c b/Xtrans.c
index 0799f04..a96e901 100644
--- a/Xtrans.c
+++ b/Xtrans.c
@@ -48,6 +48,9 @@ from The Open Group.
  */
 
 #include <ctype.h>
+#ifdef HAVE_SYSTEMD
+#include <systemd/sd-daemon.h>
+#endif
 
 /*
  * The transport table contains a definition for every transport (protocol)
@@ -1025,6 +1028,10 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret,
 #if defined(IPv6) && defined(AF_INET6)
     int		ipv6_succ = 0;
 #endif
+#ifdef HAVE_SYSTEMD
+    int		systemd_listen_fds;
+#endif /* HAVE_SYSTEMD */
+
     prmsg (2,"MakeAllCOTSServerListeners(%s,%p)\n",
 	   port ? port : "NULL", ciptrs_ret);
 
@@ -1040,6 +1047,49 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret,
             temp_ciptrs[(*count_ret)++] = ciptr;
     }
 #endif
+#ifdef HAVE_SYSTEMD
+    systemd_listen_fds = sd_listen_fds(1);
+    if (systemd_listen_fds < 0)
+    {
+	return -1;
+    }
+    else if (sd_listen_fds > 0)
+    {
+	for (i = 0; i < systemd_listen_fds; i++)
+	{
+	    struct sockaddr_storage a;
+	    int ti;
+	    socklen_t al;
+
+	    al = sizeof(a);
+	    if (getsockname(i + SD_LISTEN_FDS_START, (struct sockaddr*)&a, &al) < 0)
+		return -1;
+
+	    switch (a.ss_family)
+	    {
+	    case AF_UNIX:
+		ti = TRANS_SOCKET_UNIX_INDEX;
+		break;
+	    case AF_INET:
+		ti = TRANS_SOCKET_INET_INDEX;
+		break;
+#if defined(IPv6) && defined(AF_INET6)
+	    case AF_INET6:
+		ti = TRANS_SOCKET_INET6_INDEX;
+		break;
+#endif /* IPv6 */
+	    default:
+		return -1;
+	    }
+
+	    if ((ciptr = TRANS(ReopenCOTSServer(ti, i + SD_LISTEN_FDS_START,
+						getenv("DISPLAY"))))==NULL)
+		fprintf(stderr, "Got NULL while trying to Reopen socket received from systemd.\n");
+	    else
+		temp_ciptrs[(*count_ret)++] = ciptr;
+	}
+    }
+#endif /* HAVE_SYSTEMD */
 
     for (i = 0; i < NUMTRANS; i++)
     {
-- 
1.7.9.5



More information about the xorg-devel mailing list