Project

General

Profile

Bug #2632 » winsock2.patch

wanabe (_ wanabe), 01/23/2010 03:23 AM

View differences:

win32/win32.c (working copy)
});
return r;
}
static void
socket_clear(int fd)
{
char buf[256];
if (fcntl(fd, F_SETFL, O_NONBLOCK) != -1) {
while ((ssize_t)rb_w32_read(fd, buf, sizeof(buf)) > 0);
} else {
struct timeval timeout = {0, 0};
while(select(2, &fd, 0, 0, &timeout) > 0) {
rb_w32_read(fd, buf, sizeof(buf));
}
}
}
#undef shutdown
int WSAAPI
......
if (!NtSocketsInitialized) {
StartSockets();
}
if (how == SD_RECEIVE || how == SD_BOTH) {
socket_clear(s);
}
RUBY_CRITICAL({
r = shutdown(TO_SOCKET(s), how);
if (r == SOCKET_ERROR)
......
UnlockFile((HANDLE)sock, 0, 0, LK_LEN, LK_LEN);
return _close(fd);
}
socket_clear(fd);
_set_osfhnd(fd, (SOCKET)INVALID_HANDLE_VALUE);
key = (st_data_t)sock;
st_delete(socklist, &key, NULL);
(2-2/2)