summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_socket.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r--winsup/cygwin/fhandler_socket.cc17
1 files changed, 13 insertions, 4 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index 17900fdfe..ea057d699 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -657,6 +657,8 @@ fhandler_socket::dup (fhandler_base *child)
}
fhs->wsock_events = wsock_events;
+ fhs->rmem (rmem ());
+ fhs->wmem (wmem ());
fhs->addr_family = addr_family;
fhs->set_socket_type (get_socket_type ());
if (get_addr_family () == AF_LOCAL)
@@ -1487,10 +1489,15 @@ fhandler_socket::send_internal (struct _WSAMSG *wsamsg, int flags)
for (DWORD i = 0; i < wsamsg->dwBufferCount;
off >= wsamsg->lpBuffers[i].len && (++i, off = 0))
{
- buf.buf = wsamsg->lpBuffers[i].buf + off;
- buf.len = wsamsg->lpBuffers[i].len - off;
- if (buf.len > 65520) /* See net.cc:fdsock() and MSDN KB 823764 */
- buf.len = 65520;
+ /* FIXME? Use the same technique in call to WSASendMsg? */
+ if (!use_sendmsg)
+ {
+ buf.buf = wsamsg->lpBuffers[i].buf + off;
+ buf.len = wsamsg->lpBuffers[i].len - off;
+ /* See net.cc:fdsock() and MSDN KB 823764 */
+ if (buf.len >= (unsigned) wmem ())
+ buf.len = (unsigned) wmem () - 1;
+ }
do
{
@@ -1513,6 +1520,8 @@ fhandler_socket::send_internal (struct _WSAMSG *wsamsg, int flags)
{
off += ret;
sum += ret;
+ if (use_sendmsg)
+ break;
}
else if (is_nonblocking () || err != WSAEWOULDBLOCK)
break;