[PATCH libX11] xcb: Add TCP fallback
Jeremy Huddleston
jeremyhu at apple.com
Wed May 12 16:47:35 PDT 2010
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 <jeremyhu at apple.com>
---
src/OpenDis.c | 35 ++++++++++++++++++++++++++++-------
1 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/src/OpenDis.c b/src/OpenDis.c
index 46e1026..cd628f1 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,9 +164,30 @@ XOpenDisplay (
#if USE_XCB
if(!_XConnectXCB(dpy, display, &fullname, &iscreen)) {
- dpy->display_name = fullname;
- OutOfMemory(dpy, NULL);
- return NULL;
+ /* Try falling back on TCP if no transport specified */
+ if(*display_name == ':') {
+ size_t buf_size = strlen(display_name) + 10;
+ char *buf = (char *)Xcalloc(buf_size, sizeof(char));
+
+ if(!buf) {
+ dpy->display_name = fullname;
+ OutOfMemory(dpy, NULL);
+ return NULL;
+ }
+
+ strcpy(buf, "localhost");
+ strlcat(buf, display_name, buf_size);
+
+ if(!_XConnectXCB(dpy, buf, &fullname, &iscreen)) {
+ dpy->display_name = fullname;
+ OutOfMemory(dpy, NULL);
+ return NULL;
+ }
+ } else {
+ dpy->display_name = fullname;
+ OutOfMemory(dpy, NULL);
+ return NULL;
+ }
}
#else /* !USE_XCB */
if ((dpy->trans_conn = _X11TransConnectDisplay (
--
1.5.6.6
More information about the xorg-devel
mailing list