If we fail to connect to a UNIX socket and the transport isn't specified, fallback on TCP. This matches behavior with the xtrans codepath and the Xlib spec.
http://lists.x.org/archives/xorg-devel/2010-April/007915.html Signed-off-by: Jeremy Huddleston <[email protected]> --- This requires the previously sent libxcb patch to be effective. src/OpenDis.c | 30 ++++++++++++++++++++++++++---- 1 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/OpenDis.c b/src/OpenDis.c index 46e1026..351487e 100644 --- a/src/OpenDis.c +++ b/src/OpenDis.c @@ -93,8 +93,8 @@ XOpenDisplay ( register Display *dpy; /* New Display object being created. */ register int i; int j, k; /* random iterator indexes */ -#if !USE_XCB char *display_name; /* pointer to display name */ +#if !USE_XCB int endian; /* to determine which endian. */ xConnClientPrefix client; /* client information */ int idisplay; /* display number */ @@ -119,12 +119,13 @@ XOpenDisplay ( long setuplength; /* number of bytes in setup message */ long usedbytes = 0; /* number of bytes we have processed */ unsigned long mask; - long int conn_buf_size; - char *xlib_buffer_size; + long int conn_buf_size; + char *xlib_buffer_size; #if !USE_XCB bzero((char *) &client, sizeof(client)); bzero((char *) &prefix, sizeof(prefix)); +#endif /* !USE_XCB */ /* * If the display specifier string supplied as an argument to this @@ -140,7 +141,6 @@ XOpenDisplay ( /* Display is non-NULL, copy the pointer */ display_name = (char *)display; } -#endif /* !USE_XCB */ /* * Set the default error handlers. This allows the global variables to @@ -164,10 +164,32 @@ XOpenDisplay ( #if USE_XCB if(!_XConnectXCB(dpy, display, &fullname, &iscreen)) { + /* Try falling back on other transports if no transport specified */ + const char *slash = strrchr(display_name, '/'); + if(slash == NULL) { + const char *protocols[] = {"local", "unix", "tcp", "inet6", "inet", NULL}; + const char **s; + size_t buf_size = strlen(display_name) + 7; // max strlen + 2 (null + /) + char *buf = (char *)Xcalloc(buf_size, sizeof(char)); + + if(!buf) { + dpy->display_name = fullname; + OutOfMemory(dpy, NULL); + return NULL; + } + + for(s = protocols; *s; s++) { + snprintf(buf, buf_size, "%s/%s", *s, display_name); + if(_XConnectXCB(dpy, buf, &fullname, &iscreen)) + goto fallback_success; + } + } + dpy->display_name = fullname; OutOfMemory(dpy, NULL); return NULL; } +fallback_success: #else /* !USE_XCB */ if ((dpy->trans_conn = _X11TransConnectDisplay ( display_name, &fullname, &idisplay, -- 1.7.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
