[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