aboutsummaryrefslogtreecommitdiff
path: root/libxcb/src/xcb_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'libxcb/src/xcb_util.c')
-rw-r--r--libxcb/src/xcb_util.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/libxcb/src/xcb_util.c b/libxcb/src/xcb_util.c
index 9329b81dd..f406b0158 100644
--- a/libxcb/src/xcb_util.c
+++ b/libxcb/src/xcb_util.c
@@ -57,6 +57,13 @@
# include <sys/stat.h>
#endif
+#ifdef _MSC_VER
+#ifdef close
+#undef close
+#endif
+#define close(fd) closesocket(fd)
+#endif
+
int xcb_popcount(uint32_t mask)
{
uint32_t y;
@@ -260,7 +267,7 @@ 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;
+ char on = 1;
if(fd < 0)
return -1;
@@ -271,6 +278,23 @@ static int _xcb_do_connect(int fd, const struct sockaddr* addr, int addrlen) {
return connect(fd, addr, addrlen);
}
+#ifdef WIN32
+int InitWSA(void)
+{
+ static WSADATA wsadata;
+
+ if (!wsadata.wVersion)
+ {
+ ptw32_processInitialize();
+ if (WSAStartup(0x0202, &wsadata))
+ return -1;
+ }
+ return 0;
+}
+#else
+#define InitWSA()
+#endif
+
static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short port)
{
int fd = -1;
@@ -310,6 +334,11 @@ static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short
}
#endif
+#ifdef WIN32
+ if (InitWSA()<0)
+ return -1;
+#endif
+
snprintf(service, sizeof(service), "%hu", port);
if(getaddrinfo(host, service, &hints, &results))
/* FIXME: use gai_strerror, and fill in error connection */
@@ -430,7 +459,7 @@ xcb_connection_t *xcb_connect_to_display_with_auth_info(const char *displayname,
#ifdef _WIN32
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
- c = (xcb_connection_t *) &error_connection;
+ c = _xcb_conn_ret_error(XCB_CONN_ERROR);
goto out;
}
#endif