From 16594884da1c20c60fa1211c76939696547c02b5 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Fri, 20 Dec 2013 19:04:23 -0800 Subject: Sockets are now working properly under MSVC. I guess I broke mingw32 though, but we'll fix this later. --- src/Selectable.cc | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) (limited to 'src/Selectable.cc') diff --git a/src/Selectable.cc b/src/Selectable.cc index 40e85bc..798a448 100644 --- a/src/Selectable.cc +++ b/src/Selectable.cc @@ -3,6 +3,9 @@ #ifndef _MSC_VER #include #endif +#ifdef _WIN32 +#include +#endif #include #include #include @@ -15,7 +18,11 @@ #include "Task.h" #include "TaskMan.h" -#ifndef _WIN32 +#ifdef _WIN32 +inline static SOCKET getSocket(int fd) { return _get_osfhandle(fd); } +#else +inline static int getSocket(int fd) { return fd; } + namespace { class SigpipeBlocker : public Balau::AtStart { @@ -60,7 +67,8 @@ void Balau::Selectable::setFD(int fd) throw (GeneralException) { m_evtW = new SelectableEvent(m_fd, ev::WRITE); #ifdef _WIN32 u_long iMode = 1; - ioctlsocket(m_fd, FIONBIO, &iMode); + int r = ioctlsocket(_get_osfhandle(m_fd), FIONBIO, &iMode); + EAssert(r == NO_ERROR, "ioctlsocket FIONBIO failed with error %i", r); #else fcntl(m_fd, F_SETFL, O_NONBLOCK); #endif @@ -85,7 +93,7 @@ ssize_t Balau::Selectable::read(void * buf, size_t count) throw (GeneralExceptio int spins = 0; do { - ssize_t r = recv(m_fd, (char *) buf, count, 0); + ssize_t r = recv(getSocket(m_fd), (char *) buf, count, 0); if (r >= 0) { if (r == 0) @@ -93,7 +101,19 @@ ssize_t Balau::Selectable::read(void * buf, size_t count) throw (GeneralExceptio return r; } - if ((errno == EAGAIN) || (errno == EINTR) || (errno == EWOULDBLOCK)) { +#ifndef _WIN32 + int err = errno; +#else + int err = WSAGetLastError(); +#ifdef _MSC_VER + if (err == WSAEWOULDBLOCK) +#else + if (err == WSAWOULDBLOCK) +#endif + err = EAGAIN; +#endif + + if ((err == EAGAIN) || (err == EINTR) || (err == EWOULDBLOCK)) { Task::operationYield(m_evtR, Task::INTERRUPTIBLE); } else { m_evtR->stop(); @@ -113,7 +133,7 @@ ssize_t Balau::Selectable::write(const void * buf, size_t count) throw (GeneralE int spins = 0; do { - ssize_t r = send(m_fd, (const char *) buf, count, 0); + ssize_t r = send(getSocket(m_fd), (const char *) buf, count, 0); EAssert(r != 0, "send() returned 0 (broken pipe ?)"); @@ -121,13 +141,22 @@ ssize_t Balau::Selectable::write(const void * buf, size_t count) throw (GeneralE return r; #ifndef _WIN32 - if (errno == EPIPE) { + int err = errno; + if (err == EPIPE) { close(); return 0; } +#else + int err = WSAGetLastError(); +#ifdef _MSC_VER + if (err == WSAEWOULDBLOCK) +#else + if (err == WSAWOULDBLOCK) +#endif + err = EAGAIN; #endif - if ((errno == EAGAIN) || (errno == EINTR) || (errno == EWOULDBLOCK)) { + if ((err == EAGAIN) || (err == EINTR) || (err == EWOULDBLOCK)) { Task::operationYield(m_evtW, Task::INTERRUPTIBLE); } else { m_evtW->stop(); -- cgit v1.2.3