Am 12.07.2013 17:17, schrieb Łukasz Stelmach:
> Receive file descriptors of open sockets from systemd instead of
> creating them.
> 
> Signed-off-by: Łukasz Stelmach <[email protected]>
> Cc: Kyungmin Park <[email protected]>
> Cc: MyungJoo Ham <[email protected]>
> Cc: Piort Bereza <[email protected]>
> Cc: Karol Lewandowski <[email protected]>
> Cc: Lennart Poettering <[email protected]>
> Cc: Zbigniew Jędrzejewski-Szmek <[email protected]>
> Cc: Peter Hutterer <[email protected]>
> Cc: walter harms <[email protected]>
> Cc: Alan Coopersmith <[email protected]>
> ---
>  Xtrans.c |   78 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 77 insertions(+), 1 deletion(-)
> 
> diff --git a/Xtrans.c b/Xtrans.c
> index 5860f3a..891edb4 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)
> @@ -1037,6 +1040,75 @@ complete_network_count (void)
>  }
>  
>  
> +static int
> +receive_listening_fds(char* port, XtransConnInfo* temp_ciptrs, int* 
> count_ret)
> +
> +{
> +#ifdef HAVE_SYSTEMD
> +    XtransConnInfo   ciptr;
> +    char buffer[8];
> +    int  systemd_listen_fds, i;
> +
> +    systemd_listen_fds = sd_listen_fds(1);
> +    if (systemd_listen_fds < 0)
> +    {
> +     return -1;
> +    }

sd_listen_fds(1) can never be 0 ?


> +    else if (systemd_listen_fds > 0)
> +    {
> +     snprintf(buffer, sizeof(buffer), ":%s", port);

sorry, i feel stupid but i still can not see any use of buffer.
The others seem to use it for debugging output but not in this function.

re,
 wh

ntl: thx for making this a single function it is much more easy to review now.

> +     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)
> +             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:
> +             return -1;
> +         }
> +
> +         if ((ciptr = TRANS(ReopenCOTSServer)(ti, i + SD_LISTEN_FDS_START,
> +                                              port))==NULL)
> +             prmsg (1, "MakeAllCOTSServerListeners:"
> +                    "Got NULL while trying to reopen socket received from 
> systemd.\n");
> +         else
> +         {
> +             prmsg (5, "MakeAllCOTSServerListeners: 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
> @@ -1069,12 +1141,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",
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to