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-01 13:16:17 +0400
committerCorinna Vinschen <corinna@vinschen.de>2009-07-01 13:16:17 +0400
commit975a630109864fdb17fe3ea17365be512213a45c (patch)
tree47a8a738b77309ce4eec67d734a2e17ec8af6cd5 /winsup/cygwin/fhandler_socket.cc
parentb4fa8164748f263f152f8ec26bf361fa2d364737 (diff)
* fhandler.h (class fhandler_socket): Add class members and methods
to store and retrieve the SO_RCVBUF and SO_SNDBUF sizes. * fhandler_socket.cc (fhandler_socket::dup): Duplicate new members. (fhandler_socket::send_internal): Check for SO_SNDBUF size and restrict send to 1 byte less per KB 823764. Leave loop immediately if WSASendMsg has been used. * net.cc (fdsock): Change comment again. Set buffer sizes to 65536. Store values in fhandler_socket. (cygwin_setsockopt): Store SO_RCVBUF and SO_SNDBUF sizes in fhandler_socket. (cygwin_sendto): Drop call to sig_dispatch_pending. (cygwin_recvfrom): Ditto. (cygwin_recvmsg): Ditto. (cygwin_sendmsg): Ditto.
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;