Remove tabs and trailing whitespaces
[free-sw/xcb/libxcb] / src / xcb_util.c
index 7173db3..1625742 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>
@@ -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 */
@@ -249,10 +261,10 @@ static int _xcb_socket(int family, int type, int proto)
     if (fd == -1 && errno == EINVAL)
 #endif
     {
-       fd = socket(family, type, proto);
+        fd = socket(family, type, proto);
 #ifndef _WIN32
-       if (fd >= 0)
-           fcntl(fd, F_SETFD, FD_CLOEXEC);
+        if (fd >= 0)
+            fcntl(fd, F_SETFD, FD_CLOEXEC);
 #endif
     }
     return fd;
@@ -260,15 +272,15 @@ static int _xcb_socket(int family, int type, int proto)
 
 
 static int _xcb_do_connect(int fd, const struct sockaddr* addr, int addrlen) {
-       int on = 1;
+    int on = 1;
 
-       if(fd < 0)
-               return -1;
+    if(fd < 0)
+        return -1;
 
-       setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));
-       setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
+    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));
+    setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
 
-       return connect(fd, addr, addrlen);
+    return connect(fd, addr, addrlen);
 }
 
 static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short port)
@@ -283,13 +295,13 @@ static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short
 
     if (protocol && strcmp("tcp",protocol) && strcmp("inet",protocol)
 #ifdef AF_INET6
-                && strcmp("inet6",protocol)
+                 && strcmp("inet6",protocol)
 #endif
-       )
+        )
         return -1;
-       
+
     if (*host == '\0')
-       host = "localhost";
+        host = "localhost";
 
 #if HAVE_GETADDRINFO
     memset(&hints, 0, sizeof(hints));
@@ -422,7 +434,7 @@ xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname,
     xcb_connection_t *c;
 
     int parsed = _xcb_parse_display(displayname, &host, &protocol, &display, screenp);
-    
+
     if(!parsed) {
         c = _xcb_conn_ret_error(XCB_CONN_CLOSED_PARSE_ERR);
         goto out;
@@ -459,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);