Add Present extension
[free-sw/xcb/libxcb] / src / xcb_util.c
index a55df16..466dc23 100644 (file)
 
 /* Utility functions implementable using only public APIs. */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <assert.h>
 #include <sys/types.h>
 #include <limits.h>
 #include <stddef.h>
 #include <unistd.h>
 #include <string.h>
-#include <arpa/inet.h>
 
 #ifdef _WIN32
 #include "xcb_windefs.h"
 #else
+#include <arpa/inet.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <netinet/in.h>
@@ -51,7 +55,6 @@
 #include "xcbext.h"
 #include "xcbint.h"
 
-/* must be after "xcbint.h" to get autoconf #defines */
 #if defined(HAVE_TSOL_LABEL_H) && defined(HAVE_IS_SYSTEM_LABELED)
 # include <tsol/label.h>
 # include <sys/stat.h>
@@ -165,7 +168,11 @@ static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen);
 static int _xcb_open(const char *host, char *protocol, const int display)
 {
     int fd;
+#ifdef __hpux
+    static const char unix_base[] = "/usr/spool/sockets/X11/";
+#else
     static const char unix_base[] = "/tmp/.X11-unix/X";
+#endif
     const char *base = unix_base;
     size_t filelen;
     char *file = NULL;
@@ -175,7 +182,7 @@ static int _xcb_open(const char *host, char *protocol, const int display)
     if(strncmp(host, "/tmp/launch", 11) == 0) {
         base = host;
         host = "";
-        protocol = NULL;
+        protocol = "unix";
     }
 #endif
 
@@ -235,6 +242,11 @@ static int _xcb_open(const char *host, char *protocol, const int display)
     fd = _xcb_open_unix(protocol, file);
     free(file);
 
+    if (fd < 0 && !protocol && *host == '\0') {
+           unsigned short port = X_TCP_PORT + display;
+           fd = _xcb_open_tcp(host, protocol, port);
+    }
+
     return fd;
 #endif /* !_WIN32 */
     return -1; /* if control reaches here then something has gone wrong */
@@ -426,11 +438,22 @@ xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname,
     if(!parsed) {
         c = _xcb_conn_ret_error(XCB_CONN_CLOSED_PARSE_ERR);
         goto out;
-    } else
+    } else {
+#ifdef _WIN32
+        WSADATA wsaData;
+        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
+            c = _xcb_conn_ret_error(XCB_CONN_ERROR);
+            goto out;
+        }
+#endif
         fd = _xcb_open(host, protocol, display);
+    }
 
     if(fd == -1) {
         c = _xcb_conn_ret_error(XCB_CONN_ERROR);
+#ifdef _WIN32
+        WSACleanup();
+#endif
         goto out;
     }
 
@@ -448,6 +471,16 @@ xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname,
     else
         c = xcb_connect_to_fd(fd, 0);
 
+    if(c->has_error)
+        goto out;
+
+    /* Make sure requested screen number is in bounds for this server */
+    if((screenp != NULL) && (*screenp >= (int) c->setup->roots_len)) {
+        xcb_disconnect(c);
+        c = _xcb_conn_ret_error(XCB_CONN_CLOSED_INVALID_SCREEN);
+        goto out;
+    }
+
 out:
     free(host);
     free(protocol);