diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-07 03:52:15 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-07 03:52:15 +0000 |
commit | c7d3a06e027810cb1b8551bc28586a0a0db4737a (patch) | |
tree | 06771a9d092ce8afad5105d6394882ff65c60b74 /win32 | |
parent | 3e47b30ee12c1890aac458202e4c5f1f7707f17b (diff) | |
download | ruby-c7d3a06e027810cb1b8551bc28586a0a0db4737a.tar.gz ruby-c7d3a06e027810cb1b8551bc28586a0a0db4737a.tar.xz ruby-c7d3a06e027810cb1b8551bc28586a0a0db4737a.zip |
* {bcc32,win32,wince}/Makefile.sub (config.h): add fcntl.
* win32/win32.[ch] (fcntl): ditto.
* win32/win32.c (rb_w32_connect): support nonblocking mode.
* ext/socket/socket.c (wait_connectable, ruby_connect): support
nonblocking connect on various platforms.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@6863 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32')
-rw-r--r-- | win32/Makefile.sub | 1 | ||||
-rw-r--r-- | win32/win32.c | 49 | ||||
-rw-r--r-- | win32/win32.h | 4 |
3 files changed, 52 insertions, 2 deletions
diff --git a/win32/Makefile.sub b/win32/Makefile.sub index 4717b1572..c7d683bc8 100644 --- a/win32/Makefile.sub +++ b/win32/Makefile.sub @@ -243,6 +243,7 @@ config.h: #define HAVE_GETCWD 1 #define HAVE_CHSIZE 1 #define HAVE_TIMES 1 +#define HAVE_FCNTL 1 #define HAVE_LINK 1 #define HAVE__SETJMP 1 #define HAVE_TELLDIR 1 diff --git a/win32/win32.c b/win32/win32.c index 4203ca2ab..7c5e28335 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 diff --git a/win32/win32.h b/win32/win32.h index 672162c5c..b2ad2a33e 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -183,6 +183,7 @@ extern char *rb_w32_join_argv(char *, char *const *); extern int rb_w32_spawn(int, const char *, const char*); extern int rb_w32_aspawn(int, const char *, char *const *); extern int kill(int, int); +extern int fcntl(int, int, ...); extern pid_t rb_w32_getpid(void); #ifdef __BORLANDC__ @@ -324,6 +325,9 @@ extern char *rb_w32_strerror(int); #define ESTALE WSAESTALE #define EREMOTE WSAEREMOTE +#define F_SETFL 1 +#define O_NONBLOCK 1 + #ifdef accept #undef accept #endif |