ruby-changes:24467
From: usa <ko1@a...>
Date: Tue, 24 Jul 2012 15:05:37 +0900 (JST)
Subject: [ruby-changes:24467] usa:r36518 (trunk): * win32/win32.c (rb_w32_socket, rb_w32_socketpair): remember the family
usa 2012-07-24 15:05:29 +0900 (Tue, 24 Jul 2012) New Revision: 36518 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36518 Log: * 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. Modified files: trunk/ChangeLog trunk/win32/win32.c Index: ChangeLog =================================================================== --- ChangeLog (revision 36517) +++ ChangeLog (revision 36518) @@ -1,3 +1,14 @@ +Tue Jul 24 15:01:24 2012 NAKAMURA Usaku <usa@r...> + + * 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@r...> * test/ruby/test_dir_m17n.rb: remove a garbage. Index: win32/win32.c =================================================================== --- win32/win32.c (revision 36517) +++ win32/win32.c (revision 36518) @@ -663,6 +663,10 @@ 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 @@ /* 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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()); }); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/