diff options
Diffstat (limited to 'win32/win32.c')
-rw-r--r-- | win32/win32.c | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/win32/win32.c b/win32/win32.c index 4203ca2aba..7c5e283356 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -2047,8 +2047,16 @@ rb_w32_connect(int s, struct sockaddr *addr, int addrlen) } RUBY_CRITICAL({ r = connect(TO_SOCKET(s), addr, addrlen); - if (r == SOCKET_ERROR) - errno = map_errno(WSAGetLastError()); + if (r == SOCKET_ERROR) { + r = WSAGetLastError(); + if (r != WSAEWOULDBLOCK) { + errno = map_errno(r); + } + else { + errno = EINPROGRESS; + r = -1; + } + } }); return r; } @@ -2411,6 +2419,43 @@ void setprotoent (int stayopen) {} void setservent (int stayopen) {} +int +fcntl(int fd, int cmd, ...) +{ + SOCKET sock = TO_SOCKET(fd); + va_list va; + int arg; + int ret; + u_long ioctlArg; + + if (!is_socket(sock)) { + errno = EBADF; + return -1; + } + if (cmd != F_SETFL) { + errno = EINVAL; + return -1; + } + + va_start(va, cmd); + arg = va_arg(va, int); + va_end(va); + if (arg & O_NONBLOCK) { + ioctlArg = 1; + } + else { + ioctlArg = 0; + } + RUBY_CRITICAL({ + ret = ioctlsocket(sock, FIONBIO, &ioctlArg); + if (ret == -1) { + errno = map_errno(WSAGetLastError()); + } + }); + + return ret; +} + #ifndef WNOHANG #define WNOHANG -1 #endif |