ruby-changes:23711
From: usa <ko1@a...>
Date: Wed, 23 May 2012 10:21:47 +0900 (JST)
Subject: [ruby-changes:23711] usa:r35762 (trunk): * win32/win32.c (finish_overlapped_socket, overlapped_socket_io):
usa 2012-05-23 10:21:33 +0900 (Wed, 23 May 2012) New Revision: 35762 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35762 Log: * win32/win32.c (finish_overlapped_socket, overlapped_socket_io): replace ECONNABORTED to EPIPE in send, sendto and sendmsg to improve BSD socket compatibility. this change removes a failure on the test of net/ftp. Modified files: trunk/ChangeLog trunk/win32/win32.c Index: ChangeLog =================================================================== --- ChangeLog (revision 35761) +++ ChangeLog (revision 35762) @@ -1,3 +1,10 @@ +Wed May 23 10:18:54 2012 NAKAMURA Usaku <usa@r...> + + * win32/win32.c (finish_overlapped_socket, overlapped_socket_io): + replace ECONNABORTED to EPIPE in send, sendto and sendmsg to improve + BSD socket compatibility. this change removes a failure on the test + of net/ftp. + Wed May 23 05:35:58 2012 Eric Hodel <drbrain@s...> * lib/net/http.rb: Broke up Net::HTTP into individual files. Index: win32/win32.c =================================================================== --- win32/win32.c (revision 35761) +++ win32/win32.c (revision 35762) @@ -3084,7 +3084,7 @@ /* License: Ruby's */ static int -finish_overlapped_socket(SOCKET s, WSAOVERLAPPED *wol, int result, DWORD *len, DWORD size) +finish_overlapped_socket(BOOL input, SOCKET s, WSAOVERLAPPED *wol, int result, DWORD *len, DWORD size) { DWORD flg; int err; @@ -3103,7 +3103,10 @@ } /* thru */ default: - errno = map_errno(WSAGetLastError()); + if ((err = WSAGetLastError()) == WSAECONNABORTED && !input) + errno = EPIPE; + else + errno = map_errno(WSAGetLastError()); /* thru */ case WAIT_OBJECT_0 + 1: /* interrupted */ @@ -3113,7 +3116,10 @@ } } else { - errno = map_errno(err); + if (err == WSAECONNABORTED && !input) + errno = EPIPE; + else + errno = map_errno(err); *len = -1; } CloseHandle(wol->hEvent); @@ -3146,15 +3152,22 @@ r = recvfrom(s, buf, len, flags, addr, addrlen); else r = recv(s, buf, len, flags); + if (r == SOCKET_ERROR) + errno = map_errno(WSAGetLastError()); } else { if (addr && addrlen) r = sendto(s, buf, len, flags, addr, *addrlen); else r = send(s, buf, len, flags); + if (r == SOCKET_ERROR) { + DWORD err = WSAGetLastError(); + if (err == WSAECONNABORTED) + errno = EPIPE; + else + errno = map_errno(err); + } } - if (r == SOCKET_ERROR) - errno = map_errno(WSAGetLastError()); }); } else { @@ -3182,7 +3195,7 @@ } }); - finish_overlapped_socket(s, &wol, ret, &rlen, size); + finish_overlapped_socket(input, s, &wol, ret, &rlen, size); r = (int)rlen; } @@ -3300,7 +3313,7 @@ ret = pWSARecvMsg(s, &wsamsg, &size, &wol, NULL); }); - ret = finish_overlapped_socket(s, &wol, ret, &len, size); + ret = finish_overlapped_socket(TRUE, s, &wol, ret, &len, size); } if (ret == SOCKET_ERROR) return -1; @@ -3357,7 +3370,7 @@ ret = pWSASendMsg(s, &wsamsg, flags, &size, &wol, NULL); }); - finish_overlapped_socket(s, &wol, ret, &len, size); + finish_overlapped_socket(FALSE, s, &wol, ret, &len, size); } return len; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/