Receive file descriptors of open sockets from systemd instead of creating them.
Signed-off-by: Łukasz Stelmach <[email protected]> --- 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 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
