From bce72f63d2dfb61661f81e305ad3a7db0334403c Mon Sep 17 00:00:00 2001 From: Jeetu Golani Date: Fri, 26 Mar 2010 09:40:09 +0530 Subject: [PATCH] Win32 code for xcb-1.5 --- src/xcb.h | 4 ++++ src/xcb_auth.c | 11 ++++++++--- src/xcb_conn.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- src/xcb_in.c | 33 +++++++++++++++++++++++++++++++-- src/xcb_util.c | 24 +++++++++++++++++------- 5 files changed, 107 insertions(+), 14 deletions(-) diff --git a/src/xcb.h b/src/xcb.h index 35d8768..bd9b635 100644 --- a/src/xcb.h +++ b/src/xcb.h @@ -35,7 +35,11 @@ #include #endif +#ifndef _WIN32 #include +#else +#include "windefs.h" +#endif #include diff --git a/src/xcb_auth.c b/src/xcb_auth.c index 104f2f0..a52f922 100644 --- a/src/xcb_auth.c +++ b/src/xcb_auth.c @@ -27,13 +27,18 @@ #include #include -#include -#include -#include #include #include #include +#ifdef _WIN32 +#include "windefs.h" +#else +#include +#include +#include +#endif /* _WIN32 */ + #include "xcb.h" #include "xcbint.h" diff --git a/src/xcb_conn.c b/src/xcb_conn.c index ed2153d..4a50af3 100644 --- a/src/xcb_conn.c +++ b/src/xcb_conn.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -38,10 +37,16 @@ #include "xcbint.h" #if USE_POLL #include -#else +#elif !defined WIN32 #include #endif +#ifdef _WIN32 +#include "windefs.h" +#else +#include +#endif /* _WIN32 */ + typedef struct { uint8_t status; uint8_t pad0[5]; @@ -52,6 +57,17 @@ static const int error_connection = 1; static int set_fd_flags(const int fd) { +/* Win32 doesn't have file descriptors and the fcntl function. This block sets the socket in non-blocking mode */ + +#ifdef _WIN32 + u_long iMode = 1; /* non-zero puts it in non-blocking mode, 0 in blocking mode */ + int ret = 0; + + ret = ioctlsocket(fd, FIONBIO, &iMode); + if(ret != 0) + return 0; + return 1; +#else int flags = fcntl(fd, F_GETFL, 0); if(flags == -1) return 0; @@ -61,6 +77,7 @@ static int set_fd_flags(const int fd) if(fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) return 0; return 1; +#endif /* WIN32 */ } static int write_setup(xcb_connection_t *c, xcb_auth_info_t *auth_info) @@ -156,9 +173,37 @@ static int write_vec(xcb_connection_t *c, struct iovec **vector, int *count) { int n; assert(!c->out.queue_len); + +#ifdef _WIN32 + int i = 0; + int ret = 0,err = 0; + struct iovec *vec; + n = 0; + + /* Could use the WSASend win32 function for scatter/gather i/o but setting up the WSABUF struct from + an iovec would require more work and I'm not sure of the benefit....works for now */ + vec = *vector; + while(i < *count) + { + ret = send(c->fd,vec->iov_base,vec->iov_len,0); + if(ret == SOCKET_ERROR) + { + err = WSAGetLastError(); + if(err == WSAEWOULDBLOCK) + { + return 1; + } + } + n += ret; + *vec++; + i++; + } +#else n = writev(c->fd, *vector, *count); if(n < 0 && errno == EAGAIN) return 1; +#endif /* _WIN32 */ + if(n <= 0) { _xcb_conn_shutdown(c); diff --git a/src/xcb_in.c b/src/xcb_in.c index 80f5523..20ff4f2 100644 --- a/src/xcb_in.c +++ b/src/xcb_in.c @@ -37,10 +37,14 @@ #include "xcbint.h" #if USE_POLL #include -#else +#elif !defined WIN32 #include #endif +#ifdef _WIN32 +#include "windefs.h" +#endif /* _WIN32 */ + #define XCB_ERROR 0 #define XCB_REPLY 1 #define XCB_XGE_EVENT 35 @@ -267,12 +271,22 @@ static int read_block(const int fd, void *buf, const ssize_t len) int done = 0; while(done < len) { +#ifndef _WIN32 int ret = read(fd, ((char *) buf) + done, len - done); +#else + int ret = recv(fd, ((char *) buf) + done, len - done,0); +#endif /* !_WIN32 */ + if(ret > 0) done += ret; +#ifndef _WIN32 if(ret < 0 && errno == EAGAIN) +#else + if(ret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) +#endif /* !_Win32 */ { #if USE_POLL +#ifndef _WIN32 struct pollfd pfd; pfd.fd = fd; pfd.events = POLLIN; @@ -280,14 +294,21 @@ static int read_block(const int fd, void *buf, const ssize_t len) do { ret = poll(&pfd, 1, -1); } while (ret == -1 && errno == EINTR); +#endif /* !_WIN32 */ #else fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); +#ifndef _WIN32 do { ret = select(fd + 1, &fds, 0, 0, 0); } while (ret == -1 && errno == EINTR); -#endif +#else + /* the do while loop used for the non-windows version isn't required*/ + /* for windows since there are no signals in Windows hence no EINTR*/ + ret = select(fd + 1, &fds, 0, 0, 0); +#endif /* !_WIN32 */ +#endif /* USE_POLL */ } if(ret <= 0) return ret; @@ -665,12 +686,20 @@ void _xcb_in_replies_done(xcb_connection_t *c) int _xcb_in_read(xcb_connection_t *c) { +#ifndef _WIN32 int n = read(c->fd, c->in.queue + c->in.queue_len, sizeof(c->in.queue) - c->in.queue_len); +#else + int n = recv(c->fd, c->in.queue + c->in.queue_len, sizeof(c->in.queue) - c->in.queue_len,0); +#endif /* !_WIN32 */ if(n > 0) c->in.queue_len += n; while(read_packet(c)) /* empty */; +#ifndef _WIN32 if((n > 0) || (n < 0 && errno == EAGAIN)) +#else + if((n > 0) || (n < 0 && WSAGetLastError() == WSAEWOULDBLOCK)) +#endif /* !_WIN32 */ return 1; _xcb_conn_shutdown(c); return 0; diff --git a/src/xcb_util.c b/src/xcb_util.c index 996ff25..1848abc 100644 --- a/src/xcb_util.c +++ b/src/xcb_util.c @@ -27,23 +27,26 @@ #include #include -#include -#include -#include -#include #ifdef DNETCONN #include #include #endif -#include #include #include #include #include #include -#include #include +#ifdef _WIN32 +#include "windefs.h" +#else +#include +#include +#include +#include +#endif /* _WIN32 */ + #include "xcb.h" #include "xcbext.h" #include "xcbint.h" @@ -122,7 +125,9 @@ int xcb_parse_display(const char *name, char **host, int *displayp, } static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port); +#ifndef _WIN32 static int _xcb_open_unix(char *protocol, const char *file); +#endif /* !WIN32 */ #ifdef DNETCONN static int _xcb_open_decnet(const char *host, char *protocol, const unsigned short port); #endif @@ -162,7 +167,7 @@ static int _xcb_open(char *host, char *protocol, const int display) return _xcb_open_tcp(host, protocol, port); } } - +#ifndef _WIN32 /* display specifies Unix socket */ filelen = snprintf(file, sizeof(file), "%s%d", base, display); if(filelen < 0) @@ -176,6 +181,7 @@ static int _xcb_open(char *host, char *protocol, const int display) #endif return _xcb_open_unix(protocol, file); +#endif /* !_WIN32 */ } static int _xcb_socket(int family, int type, int proto) @@ -188,8 +194,10 @@ static int _xcb_socket(int family, int type, int proto) #endif { fd = socket(family, type, proto); +#ifndef _WIN32 if (fd >= 0) fcntl(fd, F_SETFD, FD_CLOEXEC); +#endif } return fd; } @@ -289,6 +297,7 @@ static int _xcb_open_tcp(char *host, char *protocol, const unsigned short port) return fd; } +#ifndef _WIN32 static int _xcb_open_unix(char *protocol, const char *file) { int fd; @@ -311,6 +320,7 @@ static int _xcb_open_unix(char *protocol, const char *file) } return fd; } +#endif /* !_WIN32 */ #ifdef HAVE_ABSTRACT_SOCKETS static int _xcb_open_abstract(char *protocol, const char *file, size_t filelen) -- 2.34.1