[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]