X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_util.c;h=cc4e24af2c4d881f69f69121283f2dfd14115c1a;hb=a546d00091de0ab16374dec55e8e2fa87d6bbebf;hp=996ff251834bbce68a7a6c4bf25b643824e4373c;hpb=53a9834e4cdd11aba8c1cc49347f09a958107de8;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_util.c b/src/xcb_util.c index 996ff25..cc4e24a 100644 --- a/src/xcb_util.c +++ b/src/xcb_util.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -67,7 +68,14 @@ static int _xcb_parse_display(const char *name, char **host, char **protocol, name = getenv("DISPLAY"); if(!name) return 0; + +#ifdef HAVE_LAUNCHD + if(strncmp(name, "/tmp/launch", 11) == 0) + slash = NULL; + else +#endif slash = strrchr(name, '/'); + if (slash) { len = slash - name; if (protocol) { @@ -135,12 +143,20 @@ static int _xcb_open(char *host, char *protocol, const int display) #ifdef HAVE_ABSTRACT_SOCKETS int fd; #endif - static const char base[] = "/tmp/.X11-unix/X"; - char file[sizeof(base) + 20]; - int filelen; + static const char unix_base[] = "/tmp/.X11-unix/X"; + const char *base = unix_base; + size_t filelen; + char *file = NULL; + int actual_filelen; if(*host) { +#ifdef HAVE_LAUNCHD + if(strncmp(host, "/tmp/launch", 11) == 0) { + base = host; + } else { +#endif + #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* @@ -161,21 +177,43 @@ 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; + file = malloc(filelen); + if(file == NULL) + return -1; + /* display specifies Unix socket */ - filelen = snprintf(file, sizeof(file), "%s%d", base, display); - if(filelen < 0) +#ifdef HAVE_LAUNCHD + if(base == host) + actual_filelen = snprintf(file, filelen, "%s:%d", base, display); + else +#endif + actual_filelen = snprintf(file, filelen, "%s%d", base, display); + if(actual_filelen < 0) + { + free(file); return -1; + } /* snprintf may truncate the file */ - filelen = MIN(filelen, sizeof(file) - 1); + filelen = MIN(actual_filelen, filelen - 1); #ifdef HAVE_ABSTRACT_SOCKETS fd = _xcb_open_abstract(protocol, file, filelen); if (fd >= 0 || (errno != ENOENT && errno != ECONNREFUSED)) + { + free(file); return fd; + } #endif - return _xcb_open_unix(protocol, file); + fd = _xcb_open_unix(protocol, file); + free(file); + + return fd; } static int _xcb_socket(int family, int type, int proto) @@ -354,13 +392,6 @@ xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname, int parsed = _xcb_parse_display(displayname, &host, &protocol, &display, screenp); -#ifdef HAVE_LAUNCHD - if(!displayname) - displayname = getenv("DISPLAY"); - if(displayname && strlen(displayname)>11 && !strncmp(displayname, "/tmp/launch", 11)) - fd = _xcb_open_unix(NULL, displayname); - else -#endif if(!parsed) return (xcb_connection_t *) &error_connection; else