[PATCH 2/2 libxcb] xcb_open: Improve protocol/host parsing

Jamey Sharp jamey at minilop.net
Fri May 14 13:44:16 PDT 2010


I *think* this patch makes sense... Frankly, xcb_util.c has suffered
pretty badly as the different wacky DISPLAY formats have been
implemented. If anybody can see how to make it less crazy I'd sure
appreciate patches. :-)

Until then,
Reviewed-by: Jamey Sharp <jamey at minilop.net>

Jamey

On Fri, May 14, 2010 at 1:10 PM, Jeremy Huddleston <jeremyhu at apple.com> wrote:
> Support scenarios where host is not set and protocol is.  eg:
>
> DISPLAY=tcp/:0
>
> as well as the "inet" and "inet6" alias for "tcp" for compatability
> with Xlib
>
> Signed-off-by: Jeremy Huddleston <jeremyhu at apple.com>
> ---
>  src/xcb_util.c |   30 ++++++++++++++++++------------
>  1 files changed, 18 insertions(+), 12 deletions(-)
>
> diff --git a/src/xcb_util.c b/src/xcb_util.c
> index 3516186..8c2a031 100644
> --- a/src/xcb_util.c
> +++ b/src/xcb_util.c
> @@ -129,7 +129,7 @@ int xcb_parse_display(const char *name, char **host, int *displayp,
>     return _xcb_parse_display(name, host, NULL, displayp, screenp);
>  }
>
> -static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port);
> +static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short port);
>  static int _xcb_open_unix(char *protocol, const char *file);
>  #ifdef DNETCONN
>  static int _xcb_open_decnet(const char *host, char *protocol, const unsigned short port);
> @@ -138,7 +138,7 @@ static int _xcb_open_decnet(const char *host, char *protocol, const unsigned sho
>  static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen);
>  #endif
>
> -static int _xcb_open(char *host, char *protocol, const int display)
> +static int _xcb_open(const char *host, char *protocol, const int display)
>  {
>     int fd;
>     static const char unix_base[] = "/tmp/.X11-unix/X";
> @@ -147,14 +147,16 @@ static int _xcb_open(char *host, char *protocol, const int display)
>     char *file = NULL;
>     int actual_filelen;
>
> -    if(*host)
> -    {
>  #ifdef HAVE_LAUNCHD
>         if(strncmp(host, "/tmp/launch", 11) == 0) {
> -           base = host;
> -        } else {
> +               base = host;
> +               host = "";
> +               protocol = NULL;
> +        }
>  #endif
>
> +    if(*host || protocol)
> +    {
>  #ifdef DNETCONN
>         /* DECnet displays have two colons, so _xcb_parse_display will have
>            left one at the end.  However, an IPv6 address can end with *two*
> @@ -175,9 +177,6 @@ static int _xcb_open(char *host, char *protocol, const int display)
>                 unsigned short port = X_TCP_PORT + display;
>                 return _xcb_open_tcp(host, protocol, port);
>             }
> -#ifdef HAVE_LAUNCHD
> -        }
> -#endif
>     }
>
>     filelen = strlen(base) + 1 + sizeof(display) * 3 + 1;
> @@ -187,7 +186,7 @@ static int _xcb_open(char *host, char *protocol, const int display)
>
>     /* display specifies Unix socket */
>  #ifdef HAVE_LAUNCHD
> -    if(base == host)
> +    if(strncmp(base, "/tmp/launch", 11) == 0)
>         actual_filelen = snprintf(file, filelen, "%s:%d", base, display);
>     else
>  #endif
> @@ -270,7 +269,7 @@ static int _xcb_open_decnet(const char *host, const char *protocol, const unsign
>  }
>  #endif
>
> -static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port)
> +static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short port)
>  {
>     int fd = -1;
>     struct addrinfo hints;
> @@ -278,8 +277,15 @@ static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port)
>     struct addrinfo *results, *addr;
>     char *bracket;
>
> -    if (protocol && strcmp("tcp",protocol))
> +    if (protocol && strcmp("tcp",protocol) && strcmp("inet",protocol)
> +#ifdef AF_INET6
> +                && strcmp("inet6",protocol)
> +#endif
> +       )
>         return -1;
> +
> +    if (*host == '\0')
> +       host = "localhost";
>
>     memset(&hints, 0, sizeof(hints));
>  #ifdef AI_ADDRCONFIG
> --
> 1.7.1
>
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>


More information about the xorg-devel mailing list