summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-07 03:52:15 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-07 03:52:15 +0000
commitf4d60b5f6370651978316dcecf8160781190f91f (patch)
tree06771a9d092ce8afad5105d6394882ff65c60b74 /win32
parent70f8c054b2dad9f7f5af7444fa98bfac541b216b (diff)
* {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: svn+ssh://ci.ruby-lang.org/ruby/trunk@6863 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32')
-rw-r--r--win32/Makefile.sub1
-rw-r--r--win32/win32.c49
-rw-r--r--win32/win32.h4
3 files changed, 52 insertions, 2 deletions
diff --git a/win32/Makefile.sub b/win32/Makefile.sub
index 4717b1572a..c7d683bc89 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 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
diff --git a/win32/win32.h b/win32/win32.h
index 672162c5cb..b2ad2a33ea 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