aboutsummaryrefslogtreecommitdiff
path: root/libxcb/src/xcb_conn.c
diff options
context:
space:
mode:
Diffstat (limited to 'libxcb/src/xcb_conn.c')
-rw-r--r--libxcb/src/xcb_conn.c67
1 files changed, 58 insertions, 9 deletions
diff --git a/libxcb/src/xcb_conn.c b/libxcb/src/xcb_conn.c
index 2ab84eac0..0723423f2 100644
--- a/libxcb/src/xcb_conn.c
+++ b/libxcb/src/xcb_conn.c
@@ -30,7 +30,12 @@
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
+#ifdef _MSC_VER
+#include <X11/Xwinsock.h>
+#define STDERR_FILENO stderr
+#else
#include <netinet/in.h>
+#endif
#include <fcntl.h>
#include <errno.h>
@@ -42,6 +47,8 @@
#include <sys/select.h>
#endif
+#include <X11/Xtrans/Xtrans.h>
+
/* SHUT_RDWR is fairly recent and is not available on all platforms */
#if !defined(SHUT_RDWR)
#define SHUT_RDWR 2
@@ -55,8 +62,50 @@ typedef struct {
static const int error_connection = 1;
+#ifdef _MSC_VER
+#undef close
+#define close(fd) closesocket(fd)
+
+size_t writev(int fildes, const struct iovec *iov, int iovcnt)
+{
+ int i, r;
+ char *p;
+ size_t l, sum;
+
+ /* We should buffer */
+ sum= 0;
+ for (i= 0; i<iovcnt; i++)
+ {
+ p= iov[i].iov_base;
+ l= iov[i].iov_len;
+ while (l > 0)
+ {
+ r= send(fildes, p, l, 0);
+ if (r <= 0)
+ {
+ errno =WSAGetLastError();
+ if(errno == WSAEWOULDBLOCK)
+ errno = EAGAIN;
+ if (sum)
+ return sum;
+ else
+ return r;
+ }
+ p += r;
+ l -= r;
+ sum += r;
+ }
+ }
+ return sum;
+}
+#endif
+
static int set_fd_flags(const int fd)
{
+#ifdef _MSC_VER
+ unsigned long arg = 1;
+ int ret = ioctlsocket (fd, FIONBIO, &arg);
+#else
int flags = fcntl(fd, F_GETFL, 0);
if(flags == -1)
return 0;
@@ -65,6 +114,7 @@ static int set_fd_flags(const int fd)
return 0;
if(fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
return 0;
+#endif
return 1;
}
@@ -89,7 +139,7 @@ static int write_setup(xcb_connection_t *c, xcb_auth_info_t *auth_info)
out.authorization_protocol_name_len = 0;
out.authorization_protocol_data_len = 0;
parts[count].iov_len = sizeof(xcb_setup_request_t);
- parts[count++].iov_base = &out;
+ parts[count++].iov_base = (caddr_t) &out;
parts[count].iov_len = XCB_PAD(sizeof(xcb_setup_request_t));
parts[count++].iov_base = (char *) pad;
@@ -212,14 +262,6 @@ xcb_connection_t *xcb_connect_to_fd(int fd, xcb_auth_info_t *auth_info)
{
xcb_connection_t* c;
-#ifndef USE_POLL
- if(fd >= FD_SETSIZE) /* would overflow in FD_SET */
- {
- close(fd);
- return (xcb_connection_t *) &error_connection;
- }
-#endif
-
c = calloc(1, sizeof(xcb_connection_t));
if(!c) {
close(fd);
@@ -321,6 +363,13 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec
ret = poll(&fd, 1, -1);
#else
ret = select(c->fd + 1, &rfds, &wfds, 0, 0);
+ if (ret==SOCKET_ERROR)
+ {
+ ret=-1;
+ errno = WSAGetLastError();
+ if (errno == WSAEINTR)
+ errno=EINTR;
+ }
#endif
} while (ret == -1 && errno == EINTR);
if(ret < 0)