[PATCH 2/2] Enable systemd socket activation

Peter Hutterer peter.hutterer at who-t.net
Thu Nov 28 20:37:49 PST 2013


On Thu, Nov 28, 2013 at 04:21:14PM +0100, Hans de Goede wrote:
> From: Łukasz Stelmach <l.stelmach at samsung.com>
> 
> Receive file descriptors of open sockets from systemd instead of
> creating them.
> 
> ---
>  Xtrans.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 81 insertions(+), 1 deletion(-)
> 
> diff --git a/Xtrans.c b/Xtrans.c
> index e478422..1fd8933 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)
> @@ -1051,6 +1054,79 @@ complete_network_count (void)
>  }
>  
>  
> +static int
> +receive_listening_fds(char* port, XtransConnInfo* temp_ciptrs, int* count_ret)
> +
> +{
> +#ifdef HAVE_SYSTEMD
> +    XtransConnInfo	ciptr;
> +    int  systemd_listen_fds, i;
> +
> +    systemd_listen_fds = sd_listen_fds(1);
> +    if (systemd_listen_fds < 0)
> +    {
> +        prmsg (1, "receive_listening_fds:"
> +               "sd_listen_fds failed, error %d\n", systemd_listen_fds);
> +	return -1;

there's a space/tab mix in the indentation here, but aside from that: print
maybe print strerror() which is more informative (the return value is a neg
errno)

Acked-by: Peter Hutterer <peter.hutterer at who-t.net> otherwise.

Cheers,
   Peter


> +    }
> +
> +    for (i = 0; i < systemd_listen_fds && *count_ret < NUMTRANS; i++)
> +    {
> +        struct sockaddr_storage a;
> +        int ti;
> +        const char* tn;
> +        socklen_t al;
> +
> +        al = sizeof(a);
> +        if (getsockname(i + SD_LISTEN_FDS_START, (struct sockaddr*)&a, &al) < 0) {
> +            prmsg (1, "receive_listening_fds:"
> +                   "getsockname failed, error %d\n", errno);
> +            return -1;
> +        }
> +
> +        switch (a.ss_family)
> +        {
> +        case AF_UNIX:
> +            ti = TRANS_SOCKET_UNIX_INDEX;
> +            if (*((struct sockaddr_un*)&a)->sun_path == '\0' &&
> +                al > sizeof(sa_family_t))
> +                tn = "local";
> +            else
> +                tn = "unix";
> +            break;
> +        case AF_INET:
> +            ti = TRANS_SOCKET_INET_INDEX;
> +            tn = "inet";
> +            break;
> +#if defined(IPv6) && defined(AF_INET6)
> +        case AF_INET6:
> +            ti = TRANS_SOCKET_INET6_INDEX;
> +            tn = "inet6";
> +            break;
> +#endif /* IPv6 */
> +        default:
> +            prmsg (1, "receive_listening_fds:"
> +                   "Got unknown socket address family\n");
> +            return -1;
> +        }
> +
> +        ciptr = TRANS(ReopenCOTSServer)(ti, i + SD_LISTEN_FDS_START, port);
> +        if (!ciptr)
> +        {
> +            prmsg (1, "receive_listening_fds:"
> +                   "Got NULL while trying to reopen socket received from systemd.\n");
> +            return -1;
> +        }
> +
> +        prmsg (5, "receive_listening_fds: received listener for %s, %d\n",
> +               tn, ciptr->fd);
> +        temp_ciptrs[(*count_ret)++] = ciptr;
> +        TRANS(Received)(tn);
> +    }
> +#endif /* HAVE_SYSTEMD */
> +    return 0;
> +}
> +
>  #ifdef XQUARTZ_EXPORTS_LAUNCHD_FD
>  extern int xquartz_launchd_fd;
>  #endif
> @@ -1083,12 +1159,16 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret,
>      }
>  #endif
>  
> +    if (receive_listening_fds(port, temp_ciptrs, count_ret) < 0)
> +	return -1;
> +
>      for (i = 0; i < NUMTRANS; i++)
>      {
>  	Xtransport *trans = Xtransports[i].transport;
>  	unsigned int flags = 0;
>  
> -	if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN)
> +	if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN ||
> +	    trans->flags&TRANS_RECEIVED)
>  	    continue;
>  
>  	snprintf(buffer, sizeof(buffer), "%s/:%s",
> -- 
> 1.8.4.2
> 


More information about the xorg-devel mailing list