diff options
author | Peter Harris <pharris@opentext.com> | 2010-08-31 18:33:36 -0400 |
---|---|---|
committer | Peter Harris <pharris@opentext.com> | 2010-08-31 18:35:20 -0400 |
commit | 20da10490f8dac75ec9fe1df28cb9e862e171be5 (patch) | |
tree | 0a0f1f384ad8cb461bb5aa9eb1402de086113ac3 /src/xcb_conn.c | |
parent | 7f5cfcc2fd0168d505504cc088bfdcba5c71f0ea (diff) | |
parent | 2dcf8b025be88a25d4333abdc28d425b88238d96 (diff) |
Merge branch 'master' of git://github.com/topcat/xcb-win32
Conflicts:
src/xcb_conn.c
src/xcb_util.c
Signed-off-by: Peter Harris <pharris@opentext.com>
Diffstat (limited to 'src/xcb_conn.c')
-rw-r--r-- | src/xcb_conn.c | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/src/xcb_conn.c b/src/xcb_conn.c index 803f7aa..ebaa6e2 100644 --- a/src/xcb_conn.c +++ b/src/xcb_conn.c @@ -30,7 +30,6 @@ #include <stdio.h> #include <unistd.h> #include <stdlib.h> -#include <netinet/in.h> #include <fcntl.h> #include <errno.h> @@ -38,10 +37,16 @@ #include "xcbint.h" #if USE_POLL #include <poll.h> -#else +#elif !defined _WIN32 #include <sys/select.h> #endif +#ifdef _WIN32 +#include "xcb_windefs.h" +#else +#include <netinet/in.h> +#endif /* _WIN32 */ + /* SHUT_RDWR is fairly recent and is not available on all platforms */ #if !defined(SHUT_RDWR) #define SHUT_RDWR 2 @@ -57,6 +62,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; @@ -66,6 +82,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) @@ -158,9 +175,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); |