Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-07-07 00:30:34 +0400
committerCorinna Vinschen <corinna@vinschen.de>2009-07-07 00:30:34 +0400
commit58fc288adafaf80a85b5bb353a29d75b87d3fc72 (patch)
treea50b7dec18df739ea69b47e36542ae417406ddae
parent394660ec2f71ee3559dd13c2743646fc8e7d75f9 (diff)
* fhandler_socket.cc (fhandler_socket::recv_internal): Convert wsabuf
and wsacnt to references. Fix handling of WSAEMSGSIZE.
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/fhandler_socket.cc23
2 files changed, 18 insertions, 10 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 4a16d36ab..b731ef181 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,10 @@
2009-07-06 Corinna Vinschen <corinna@vinschen.de>
+ * fhandler_socket.cc (fhandler_socket::recv_internal): Convert wsabuf
+ and wsacnt to references. Fix handling of WSAEMSGSIZE.
+
+2009-07-06 Corinna Vinschen <corinna@vinschen.de>
+
* cygtls.h (struct _local_storage): Add thread storage pointers for
memory used by socket select functions. Combine them into a single
struct select.
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index ea057d699..bd6a2fb31 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -1309,8 +1309,8 @@ fhandler_socket::recv_internal (LPWSAMSG wsamsg)
ssize_t res = 0;
DWORD ret = 0, wret;
int evt_mask = FD_READ | ((wsamsg->dwFlags & MSG_OOB) ? FD_OOB : 0);
- LPWSABUF wsabuf = wsamsg->lpBuffers;
- ULONG wsacnt = wsamsg->dwBufferCount;
+ LPWSABUF &wsabuf = wsamsg->lpBuffers;
+ ULONG &wsacnt = wsamsg->dwBufferCount;
bool use_recvmsg = false;
static NO_COPY LPFN_WSARECVMSG WSARecvMsg;
@@ -1383,20 +1383,23 @@ fhandler_socket::recv_internal (LPWSAMSG wsamsg)
break;
}
- if (!ret && res == SOCKET_ERROR)
+ if (res)
{
/* According to SUSv3, errno isn't set in that case and no error
condition is returned. */
if (WSAGetLastError () == WSAEMSGSIZE)
- return ret;
+ return ret + wret;
- /* ESHUTDOWN isn't defined for recv in SUSv3. Simply EOF is returned
- in this case. */
- if (WSAGetLastError () == WSAESHUTDOWN)
- return 0;
+ if (!ret)
+ {
+ /* ESHUTDOWN isn't defined for recv in SUSv3. Simply EOF is returned
+ in this case. */
+ if (WSAGetLastError () == WSAESHUTDOWN)
+ return 0;
- set_winsock_errno ();
- return SOCKET_ERROR;
+ set_winsock_errno ();
+ return SOCKET_ERROR;
+ }
}
return ret;