[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