mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* win32/win32.c (rb_w32_socket, rb_w32_socketpair): remember the family
in the high word of socklist value. * win32/win32.c (overlapped_socket_io, recvmsg, sendmsg, setfl): follow above changes. * win32/win32.c (rb_w32_getsockname): set remembered family to the argument when OS's function fails. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36518 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7b8e78f747
commit
8122db83ce
2 changed files with 44 additions and 11 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
Tue Jul 24 15:01:24 2012 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||
|
||||
* win32/win32.c (rb_w32_socket, rb_w32_socketpair): remember the family
|
||||
in the high word of socklist value.
|
||||
|
||||
* win32/win32.c (overlapped_socket_io, recvmsg, sendmsg, setfl): follow
|
||||
above changes.
|
||||
|
||||
* win32/win32.c (rb_w32_getsockname): set remembered family to the
|
||||
argument when OS's function fails.
|
||||
|
||||
Tue Jul 24 12:35:13 2012 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||
|
||||
* test/ruby/test_dir_m17n.rb: remove a garbage.
|
||||
|
|
|
@ -663,6 +663,10 @@ StartSockets(void)
|
|||
NtSocketsInitialized = 1;
|
||||
}
|
||||
|
||||
#define MAKE_SOCKDATA(af, fl) ((int)((((int)af)<<4)|((fl)&0xFFFF)))
|
||||
#define GET_FAMILY(v) ((int)(((v)>>4)&0xFFFF))
|
||||
#define GET_FLAGS(v) ((int)((v)&0xFFFF))
|
||||
|
||||
/* License: Ruby's */
|
||||
static inline int
|
||||
socklist_insert(SOCKET sock, int flag)
|
||||
|
@ -2994,16 +2998,31 @@ rb_w32_getpeername(int s, struct sockaddr *addr, int *addrlen)
|
|||
|
||||
/* License: Artistic or GPL */
|
||||
int WSAAPI
|
||||
rb_w32_getsockname(int s, struct sockaddr *addr, int *addrlen)
|
||||
rb_w32_getsockname(int fd, struct sockaddr *addr, int *addrlen)
|
||||
{
|
||||
int sock;
|
||||
int r;
|
||||
if (!NtSocketsInitialized) {
|
||||
StartSockets();
|
||||
}
|
||||
RUBY_CRITICAL({
|
||||
r = getsockname(TO_SOCKET(s), addr, addrlen);
|
||||
if (r == SOCKET_ERROR)
|
||||
errno = map_errno(WSAGetLastError());
|
||||
sock = TO_SOCKET(fd);
|
||||
r = getsockname(sock, addr, addrlen);
|
||||
if (r == SOCKET_ERROR) {
|
||||
DWORD wsaerror = WSAGetLastError();
|
||||
if (wsaerror == WSAEINVAL) {
|
||||
int flags;
|
||||
if (socklist_lookup(sock, &flags)) {
|
||||
int af = GET_FAMILY(flags);
|
||||
if (af) {
|
||||
memset(addr, 0, *addrlen);
|
||||
addr->sa_family = af;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
errno = map_errno(wsaerror);
|
||||
}
|
||||
});
|
||||
return r;
|
||||
}
|
||||
|
@ -3130,7 +3149,7 @@ overlapped_socket_io(BOOL input, int fd, char *buf, int len, int flags,
|
|||
|
||||
s = TO_SOCKET(fd);
|
||||
socklist_lookup(s, &mode);
|
||||
if (!cancel_io || (mode & O_NONBLOCK)) {
|
||||
if (!cancel_io || (GET_FLAGS(mode) & O_NONBLOCK)) {
|
||||
RUBY_CRITICAL({
|
||||
if (input) {
|
||||
if (addr && addrlen)
|
||||
|
@ -3281,7 +3300,7 @@ recvmsg(int fd, struct msghdr *msg, int flags)
|
|||
wsamsg.dwFlags |= flags;
|
||||
|
||||
socklist_lookup(s, &mode);
|
||||
if (!cancel_io || (mode & O_NONBLOCK)) {
|
||||
if (!cancel_io || (GET_FLAGS(mode) & O_NONBLOCK)) {
|
||||
RUBY_CRITICAL({
|
||||
if ((ret = pWSARecvMsg(s, &wsamsg, &len, NULL, NULL)) == SOCKET_ERROR) {
|
||||
errno = map_errno(WSAGetLastError());
|
||||
|
@ -3338,7 +3357,7 @@ sendmsg(int fd, const struct msghdr *msg, int flags)
|
|||
msghdr_to_wsamsg(msg, &wsamsg);
|
||||
|
||||
socklist_lookup(s, &mode);
|
||||
if (!cancel_io || (mode & O_NONBLOCK)) {
|
||||
if (!cancel_io || (GET_FLAGS(mode) & O_NONBLOCK)) {
|
||||
RUBY_CRITICAL({
|
||||
if ((ret = pWSASendMsg(s, &wsamsg, flags, &len, NULL, NULL)) == SOCKET_ERROR) {
|
||||
errno = map_errno(WSAGetLastError());
|
||||
|
@ -3466,7 +3485,7 @@ rb_w32_socket(int af, int type, int protocol)
|
|||
else {
|
||||
fd = rb_w32_open_osfhandle(s, O_RDWR|O_BINARY|O_NOINHERIT);
|
||||
if (fd != -1)
|
||||
socklist_insert(s, 0);
|
||||
socklist_insert(s, MAKE_SOCKDATA(af, 0));
|
||||
else
|
||||
closesocket(s);
|
||||
}
|
||||
|
@ -3711,8 +3730,8 @@ rb_w32_socketpair(int af, int type, int protocol, int *sv)
|
|||
closesocket(pair[1]);
|
||||
return -1;
|
||||
}
|
||||
socklist_insert(pair[0], 0);
|
||||
socklist_insert(pair[1], 0);
|
||||
socklist_insert(pair[0], MAKE_SOCKDATA(af, 0));
|
||||
socklist_insert(pair[1], MAKE_SOCKDATA(af, 0));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -3749,10 +3768,13 @@ static int
|
|||
setfl(SOCKET sock, int arg)
|
||||
{
|
||||
int ret;
|
||||
int af = 0;
|
||||
int flag = 0;
|
||||
u_long ioctlArg;
|
||||
|
||||
socklist_lookup(sock, &flag);
|
||||
af = GET_FAMILY(flag);
|
||||
flag = GET_FLAGS(flag);
|
||||
if (arg & O_NONBLOCK) {
|
||||
flag |= O_NONBLOCK;
|
||||
ioctlArg = 1;
|
||||
|
@ -3764,7 +3786,7 @@ setfl(SOCKET sock, int arg)
|
|||
RUBY_CRITICAL({
|
||||
ret = ioctlsocket(sock, FIONBIO, &ioctlArg);
|
||||
if (ret == 0)
|
||||
socklist_insert(sock, flag);
|
||||
socklist_insert(sock, MAKE_SOCKDATA(af, flag));
|
||||
else
|
||||
errno = map_errno(WSAGetLastError());
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue