Commit 25bc6de8 authored by Bruno Jesus's avatar Bruno Jesus Committed by Alexandre Julliard

ws2_32: Take care of EINTR inside the helpers.

parent 7c7ccc0e
...@@ -1921,8 +1921,11 @@ static int WS2_recv( int fd, struct ws2_async *wsa ) ...@@ -1921,8 +1921,11 @@ static int WS2_recv( int fd, struct ws2_async *wsa )
hdr.msg_flags = 0; hdr.msg_flags = 0;
#endif #endif
if ( (n = recvmsg(fd, &hdr, wsa->flags)) == -1 ) while ((n = recvmsg(fd, &hdr, wsa->flags)) == -1)
return -1; {
if (errno != EINTR)
return -1;
}
#ifdef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS #ifdef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
if (wsa->control) if (wsa->control)
...@@ -1981,7 +1984,7 @@ static NTSTATUS WS2_async_recv( void* user, IO_STATUS_BLOCK* iosb, NTSTATUS stat ...@@ -1981,7 +1984,7 @@ static NTSTATUS WS2_async_recv( void* user, IO_STATUS_BLOCK* iosb, NTSTATUS stat
} }
else else
{ {
if (errno == EINTR || errno == EAGAIN) if (errno == EAGAIN)
{ {
status = STATUS_PENDING; status = STATUS_PENDING;
_enable_event( wsa->hSocket, FD_READ, 0, 0 ); _enable_event( wsa->hSocket, FD_READ, 0, 0 );
...@@ -2172,17 +2175,19 @@ static int WS2_send( int fd, struct ws2_async *wsa ) ...@@ -2172,17 +2175,19 @@ static int WS2_send( int fd, struct ws2_async *wsa )
hdr.msg_flags = 0; hdr.msg_flags = 0;
#endif #endif
ret = sendmsg(fd, &hdr, wsa->flags); while ((ret = sendmsg(fd, &hdr, wsa->flags)) == -1)
if (ret >= 0)
{ {
n = ret; if (errno != EINTR)
while (wsa->first_iovec < wsa->n_iovecs && wsa->iovec[wsa->first_iovec].iov_len <= n) return -1;
n -= wsa->iovec[wsa->first_iovec++].iov_len; }
if (wsa->first_iovec < wsa->n_iovecs)
{ n = ret;
wsa->iovec[wsa->first_iovec].iov_base = (char*)wsa->iovec[wsa->first_iovec].iov_base + n; while (wsa->first_iovec < wsa->n_iovecs && wsa->iovec[wsa->first_iovec].iov_len <= n)
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; return ret;
} }
...@@ -2222,7 +2227,7 @@ static NTSTATUS WS2_async_send(void* user, IO_STATUS_BLOCK* iosb, NTSTATUS statu ...@@ -2222,7 +2227,7 @@ static NTSTATUS WS2_async_send(void* user, IO_STATUS_BLOCK* iosb, NTSTATUS statu
iosb->Information += result; iosb->Information += result;
} }
else if (errno == EINTR || errno == EAGAIN) else if (errno == EAGAIN)
{ {
status = STATUS_PENDING; status = STATUS_PENDING;
} }
...@@ -4554,11 +4559,7 @@ static int WS2_sendto( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, ...@@ -4554,11 +4559,7 @@ static int WS2_sendto( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
totalLength += lpBuffers[i].len; totalLength += lpBuffers[i].len;
} }
for (;;) n = WS2_send( fd, wsa );
{
n = WS2_send( fd, wsa );
if (n != -1 || errno != EINTR) break;
}
if (n == -1 && errno != EAGAIN) if (n == -1 && errno != EAGAIN)
{ {
err = wsaErrno(); err = wsaErrno();
...@@ -4651,7 +4652,7 @@ static int WS2_sendto( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, ...@@ -4651,7 +4652,7 @@ static int WS2_sendto( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
} }
n = WS2_send( fd, wsa ); n = WS2_send( fd, wsa );
if (n == -1 && errno != EAGAIN && errno != EINTR) if (n == -1 && errno != EAGAIN)
{ {
err = wsaErrno(); err = wsaErrno();
goto error; goto error;
...@@ -6570,7 +6571,6 @@ static int WS2_recv_base( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, ...@@ -6570,7 +6571,6 @@ static int WS2_recv_base( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
n = WS2_recv( fd, wsa ); n = WS2_recv( fd, wsa );
if (n == -1) if (n == -1)
{ {
if (errno == EINTR) continue;
if (errno != EAGAIN) if (errno != EAGAIN)
{ {
int loc_errno = errno; int loc_errno = errno;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment