[Xcb] [PATCH] libX11/libxcb no longer supports unix: notation
Barton C Massey
bart at cs.pdx.edu
Thu Jul 19 11:46:21 PDT 2007
Weird. I was sure I caught that case when I wrote the
original code. Oh well, it's moot now---thanks much to
Egbert and yourself for the fix! Looks good to me.
Bart
In message <20070719150237.GA5525 at suse.de> you wrote:
>
> --Pd0ReVV5GZGQvF3a
> Content-Type: text/plain; charset=us-ascii
> Content-Disposition: inline
>
> This has been discussed in Novell' bugzilla:
>
> https://bugzilla.novell.com/show_bug.cgi?id=289007
>
> Also, a similar change has been introduced to non-XCB libX11 lately
> (Mail by Kean Johnston on 17 Jul 2007 on xorg ML).
>
>
> Looks like new libX11/libxcb no longer supports unix: notation in
> $DISPLAY (used in a lot of scripts). How to reproduce:
>
> DISPLAY=unix:0 xterm
>
> old libX11 w/o libxcb: works
> new libX11 / libxcb: xterm Xt error: Can't open display: unix:0
>
>
> The attached patch from Egbert fixes this for libxcb. If there's no
> objection against it, I'll push this next week.
>
> CU
>
> Matthias
>
> --
> Matthias Hopf <mhopf at suse.de> __ __ __
> Maxfeldstr. 5 / 90409 Nuernberg (_ | | (_ |__ mat at mshopf.de
> Phone +49-911-74053-715 __) |_| __) |__ R & D www.mshopf.de
>
> --Pd0ReVV5GZGQvF3a
> Content-Type: text/x-patch; charset=us-ascii
> Content-Disposition: attachment; filename="libxcb-display_unix.diff"
>
> diff --git a/src/xcb_util.c b/src/xcb_util.c
> index eeee1dd..dd2305a 100644
> --- a/src/xcb_util.c
> +++ b/src/xcb_util.c
> @@ -55,14 +55,30 @@ int xcb_popcount(uint32_t mask)
> return ((y + (y >> 3)) & 030707070707) % 077;
> }
>
> -int xcb_parse_display(const char *name, char **host, int *displayp, int *screenp)
> +static int _xcb_parse_display(const char *name, char **host, char **protocol,
> + int *displayp, int *screenp)
> {
> int len, display, screen;
> - char *colon, *dot, *end;
> + char *slash, *colon, *dot, *end;
> if(!name || !*name)
> name = getenv("DISPLAY");
> if(!name)
> return 0;
> + slash = strrchr(name, '/');
> + if (slash) {
> + len = slash - name;
> + if (protocol) {
> + *protocol = malloc(len + 1);
> + if(!*protocol)
> + return 0;
> + memcpy(*protocol, name, len);
> + (*protocol)[len] = '\0';
> + }
> + name = slash + 1;
> + } else
> + if (protocol)
> + *protocol = NULL;
> +
> colon = strrchr(name, ':');
> if(!colon)
> return 0;
> @@ -96,51 +112,58 @@ int xcb_parse_display(const char *name,
> return 1;
> }
>
> -static int _xcb_open_tcp(char *host, const unsigned short port);
> -static int _xcb_open_unix(const char *file);
> +int xcb_parse_display(const char *name, char **host, int *displayp,
> + int *screenp)
> +{
> + 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_unix(char *protocol, const char *file);
> #ifdef DNETCONN
> -static int _xcb_open_decnet(const char *host, const unsigned short port);
> +static int _xcb_open_decnet(const char *host, char *protocol, const unsigned short port);
> #endif
>
> -static int _xcb_open(char *host, const int display)
> +static int _xcb_open(char *host, char *protocol, const int display)
> {
> int fd;
> + static const char base[] = "/tmp/.X11-unix/X";
> + char file[sizeof(base) + 20];
>
> if(*host)
> {
> #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* colons,
> - so only treat this as a DECnet display if host ends with exactly one
> - colon. */
> + /* DECnet displays have two colons, so _xcb_parse_display will have
> + left one at the end. However, an IPv6 address can end with *two*
> + colons, so only treat this as a DECnet display if host ends with
> + exactly one colon. */
> char *colon = strchr(host, ':');
> if(colon && *(colon+1) == '\0')
> {
> *colon = '\0';
> - fd = _xcb_open_decnet(host, display);
> + return _xcb_open_decnet(host, protocol, display);
> }
> else
> #endif
> - {
> - /* display specifies TCP */
> - unsigned short port = X_TCP_PORT + display;
> - fd = _xcb_open_tcp(host, port);
> - }
> - }
> - else
> - {
> - /* display specifies Unix socket */
> - static const char base[] = "/tmp/.X11-unix/X";
> - char file[sizeof(base) + 20];
> - snprintf(file, sizeof(file), "%s%d", base, display);
> - fd = _xcb_open_unix(file);
> + if (protocol
> + || strcmp("unix",host)) { /* follow the old unix: rule */
> +
> + /* display specifies TCP */
> + unsigned short port = X_TCP_PORT + display;
> + return _xcb_open_tcp(host, protocol, port);
> + }
> }
>
> + /* display specifies Unix socket */
> + snprintf(file, sizeof(file), "%s%d", base, display);
> + return _xcb_open_unix(protocol, file);
> +
> +
> return fd;
> }
>
> #ifdef DNETCONN
> -static int _xcb_open_decnet(const char *host, const unsigned short port)
> +static int _xcb_open_decnet(const char *host, const char *protocol, const unsigned short port)
> {
> int fd;
> struct sockaddr_dn addr;
> @@ -149,6 +172,8 @@ static int _xcb_open_decnet(const char *
>
> if(!nodeaddr)
> return -1;
> + if (protocol && strcmp("dnet",protocol))
> + return -1;
> addr.sdn_family = AF_DECnet;
>
> addr.sdn_add.a_len = nodeaddr->n_length;
> @@ -173,7 +198,7 @@ static int _xcb_open_decnet(const char *
> }
> #endif
>
> -static int _xcb_open_tcp(char *host, const unsigned short port)
> +static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port)
> {
> int fd = -1;
> struct addrinfo hints = { 0
> @@ -187,7 +212,10 @@ static int _xcb_open_tcp(char *host, con
> char service[6]; /* "65535" with the trailing '\0' */
> struct addrinfo *results, *addr;
> char *bracket;
> -
> +
> + if (protocol && strcmp("tcp",protocol))
> + return -1;
> +
> /* Allow IPv6 addresses enclosed in brackets. */
> if(host[0] == '[' && (bracket = strrchr(host, ']')) && bracket[1] == '\0')
> {
> @@ -213,10 +241,14 @@ static int _xcb_open_tcp(char *host, con
> return fd;
> }
>
> -static int _xcb_open_unix(const char *file)
> +static int _xcb_open_unix(char *protocol, const char *file)
> {
> int fd;
> struct sockaddr_un addr = { AF_UNIX };
> +
> + if (protocol && strcmp("unix",protocol))
> + return -1;
> +
> strcpy(addr.sun_path, file);
>
> fd = socket(AF_UNIX, SOCK_STREAM, 0);
> @@ -231,12 +263,13 @@ xcb_connection_t *xcb_connect(const char
> {
> int fd, display = 0;
> char *host;
> + char *protocol;
> xcb_connection_t *c;
> xcb_auth_info_t auth;
>
> - if(!xcb_parse_display(displayname, &host, &display, screenp))
> + if(!_xcb_parse_display(displayname, &host, &protocol, &display, screenp))
> return (xcb_connection_t *) &error_connection;
> - fd = _xcb_open(host, display);
> + fd = _xcb_open(host, protocol, display);
> free(host);
> if(fd == -1)
> return (xcb_connection_t *) &error_connection;
> @@ -256,10 +289,11 @@ xcb_connection_t *xcb_connect_to_display
> {
> int fd, display = 0;
> char *host;
> + char *protocol;
>
> - if(!xcb_parse_display(displayname, &host, &display, screenp))
> + if(!_xcb_parse_display(displayname, &host, &protocol, &display, screenp))
> return (xcb_connection_t *) &error_connection;
> - fd = _xcb_open(host, display);
> + fd = _xcb_open(host, protocol, display);
> free(host);
> if(fd == -1)
> return (xcb_connection_t *) &error_connection;
>
> --Pd0ReVV5GZGQvF3a
> Content-Type: text/plain; charset="us-ascii"
> MIME-Version: 1.0
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline
>
> _______________________________________________
> Xcb mailing list
> Xcb at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xcb
> --Pd0ReVV5GZGQvF3a--
More information about the Xcb
mailing list