Replace my old generic map ADT with a growable array for the extension cache.
[free-sw/xcb/libxcb] / src / xcb_conn.c
index de55951..5839ed8 100644 (file)
 #include <stdlib.h>
 #include <netinet/in.h>
 #include <sys/select.h>
+#include <sys/fcntl.h>
 
 #include "xcb.h"
 #include "xcbint.h"
 
+static int set_fd_flags(const int fd)
+{
+    long flags = fcntl(fd, F_GETFL, 0);
+    if(flags == -1)
+        return 0;
+    flags |= O_NONBLOCK;
+    if(fcntl(fd, F_SETFL, flags) == -1)
+        return 0;
+    if(fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
+        return 0;
+    return 1;
+}
+
 static int write_setup(XCBConnection *c, XCBAuthInfo *auth_info)
 {
     static const char pad[3];
@@ -88,7 +102,7 @@ static int read_setup(XCBConnection *c)
     if(!c->setup)
         return 0;
 
-    if(_xcb_read_block(c->fd, c->setup, sizeof(XCBConnSetupGenericRep)) != sizeof(XCBConnSetupGenericRep))
+    if(_xcb_in_read_block(c, c->setup, sizeof(XCBConnSetupGenericRep)) != sizeof(XCBConnSetupGenericRep))
         return 0;
 
     {
@@ -98,7 +112,7 @@ static int read_setup(XCBConnection *c)
         c->setup = tmp;
     }
 
-    if(_xcb_read_block(c->fd, (char *) c->setup + sizeof(XCBConnSetupGenericRep), c->setup->length * 4) <= 0)
+    if(_xcb_in_read_block(c, (char *) c->setup + sizeof(XCBConnSetupGenericRep), c->setup->length * 4) <= 0)
         return 0;
 
     /* 0 = failed, 2 = authenticate, 1 = success */
@@ -147,7 +161,7 @@ XCBConnection *XCBConnectToFD(int fd, XCBAuthInfo *auth_info)
     c->fd = fd;
 
     if(!(
-        _xcb_set_fd_flags(fd) &&
+        set_fd_flags(fd) &&
         pthread_mutex_init(&c->iolock, 0) == 0 &&
         _xcb_in_init(&c->in) &&
         _xcb_out_init(&c->out) &&