Module: wine Branch: master Commit: 388398bd057c6292414f5b875c58b59d765a2562 URL: http://source.winehq.org/git/wine.git/?a=commit;h=388398bd057c6292414f5b875c...
Author: Mike Kaplinskiy mike.kaplinskiy@gmail.com Date: Mon Jan 24 00:19:12 2011 -0500
ws2_32: Fix up iovecs after transmission in WS2_send instead of WS2_sendto.
---
dlls/ws2_32/socket.c | 32 +++++++++++++++++++------------- 1 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 43d4598..6b3925b 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -1725,6 +1725,7 @@ static int WS2_send( int fd, struct ws2_async *wsa ) { struct msghdr hdr; union generic_unix_sockaddr unix_addr; + int n, ret;
hdr.msg_name = NULL; hdr.msg_namelen = 0; @@ -1768,7 +1769,19 @@ static int WS2_send( int fd, struct ws2_async *wsa ) hdr.msg_flags = 0; #endif
- return sendmsg(fd, &hdr, wsa->flags); + ret = sendmsg(fd, &hdr, wsa->flags); + if (ret >= 0) + { + n = ret; + while (wsa->first_iovec < wsa->n_iovecs && wsa->iovec[wsa->first_iovec].iov_len <= n) + n -= wsa->iovec[wsa->first_iovec++].iov_len; + if (wsa->first_iovec < wsa->n_iovecs) + { + wsa->iovec[wsa->first_iovec].iov_base = (char*)wsa->iovec[wsa->first_iovec].iov_base + n; + wsa->iovec[wsa->first_iovec].iov_len -= n; + } + } + return ret; }
/*********************************************************************** @@ -3942,23 +3955,13 @@ static int WS2_sendto( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, * sending blocks until the entire buffer is sent. */ DWORD timeout_start = GetTickCount();
- *lpNumberOfBytesSent = 0; + *lpNumberOfBytesSent = n == -1 ? 0 : n;
- while (wsa->first_iovec < dwBufferCount) + while (wsa->first_iovec < wsa->n_iovecs) { struct pollfd pfd; int timeout = GET_SNDTIMEO(fd);
- if (n >= 0) - { - *lpNumberOfBytesSent += n; - while (wsa->first_iovec < dwBufferCount && wsa->iovec[wsa->first_iovec].iov_len <= n) - n -= wsa->iovec[wsa->first_iovec++].iov_len; - if (wsa->first_iovec >= dwBufferCount) break; - wsa->iovec[wsa->first_iovec].iov_base = (char*)wsa->iovec[wsa->first_iovec].iov_base + n; - wsa->iovec[wsa->first_iovec].iov_len -= n; - } - if (timeout != -1) { timeout -= GetTickCount() - timeout_start; @@ -3980,6 +3983,9 @@ static int WS2_sendto( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, err = wsaErrno(); goto error; } + + if (n >= 0) + *lpNumberOfBytesSent += n; } } else /* non-blocking */