ws2_32: Return a WSA error code from _is_blocking().

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
oldstable
Alexandre Julliard 2018-11-20 14:41:31 +01:00
parent f670a162a0
commit 4383a9d536
1 changed files with 24 additions and 43 deletions

View File

@ -1146,19 +1146,19 @@ static void _enable_event( HANDLE s, unsigned int event,
SERVER_END_REQ; SERVER_END_REQ;
} }
static NTSTATUS _is_blocking(SOCKET s, BOOL *ret) static DWORD sock_is_blocking(SOCKET s, BOOL *ret)
{ {
NTSTATUS status; DWORD err;
SERVER_START_REQ( get_socket_event ) SERVER_START_REQ( get_socket_event )
{ {
req->handle = wine_server_obj_handle( SOCKET2HANDLE(s) ); req->handle = wine_server_obj_handle( SOCKET2HANDLE(s) );
req->service = FALSE; req->service = FALSE;
req->c_event = 0; req->c_event = 0;
status = wine_server_call( req ); err = NtStatusToWSAError( wine_server_call( req ));
*ret = (reply->state & FD_WINE_NONBLOCKING) == 0; *ret = (reply->state & FD_WINE_NONBLOCKING) == 0;
} }
SERVER_END_REQ; SERVER_END_REQ;
return status; return err;
} }
static unsigned int _get_sock_mask(SOCKET s) static unsigned int _get_sock_mask(SOCKET s)
@ -1181,7 +1181,7 @@ static void _sync_sock_state(SOCKET s)
BOOL dummy; BOOL dummy;
/* do a dummy wineserver request in order to let /* do a dummy wineserver request in order to let
the wineserver run through its select loop once */ the wineserver run through its select loop once */
(void)_is_blocking(s, &dummy); sock_is_blocking(s, &dummy);
} }
static void _get_sock_errors(SOCKET s, int *events) static void _get_sock_errors(SOCKET s, int *events)
@ -2761,12 +2761,13 @@ static int WS2_register_async_shutdown( SOCKET s, int type )
SOCKET WINAPI WS_accept(SOCKET s, struct WS_sockaddr *addr, int *addrlen32) SOCKET WINAPI WS_accept(SOCKET s, struct WS_sockaddr *addr, int *addrlen32)
{ {
NTSTATUS status; NTSTATUS status;
DWORD err;
SOCKET as; SOCKET as;
BOOL is_blocking; BOOL is_blocking;
TRACE("socket %04lx\n", s ); TRACE("socket %04lx\n", s );
status = _is_blocking(s, &is_blocking); err = sock_is_blocking(s, &is_blocking);
if (status) if (err)
goto error; goto error;
do { do {
@ -2799,10 +2800,11 @@ SOCKET WINAPI WS_accept(SOCKET s, struct WS_sockaddr *addr, int *addrlen32)
release_sock_fd( s, fd ); release_sock_fd( s, fd );
} }
} while (is_blocking && status == STATUS_CANT_WAIT); } while (is_blocking && status == STATUS_CANT_WAIT);
err = NtStatusToWSAError( status );
error: error:
set_error(status); WARN(" -> ERROR %d\n", err);
WARN(" -> ERROR %d\n", GetLastError()); SetLastError(err);
return INVALID_SOCKET; return INVALID_SOCKET;
} }
@ -3467,7 +3469,6 @@ int WINAPI WS_connect(SOCKET s, const struct WS_sockaddr* name, int namelen)
if (fd != -1) if (fd != -1)
{ {
NTSTATUS status;
BOOL is_blocking; BOOL is_blocking;
int ret = do_connect(fd, name, namelen); int ret = do_connect(fd, name, namelen);
if (ret == 0) if (ret == 0)
@ -3479,33 +3480,21 @@ int WINAPI WS_connect(SOCKET s, const struct WS_sockaddr* name, int namelen)
_enable_event(SOCKET2HANDLE(s), FD_CONNECT|FD_READ|FD_WRITE, _enable_event(SOCKET2HANDLE(s), FD_CONNECT|FD_READ|FD_WRITE,
FD_CONNECT, FD_CONNECT,
FD_WINE_CONNECTED|FD_WINE_LISTENING); FD_WINE_CONNECTED|FD_WINE_LISTENING);
status = _is_blocking( s, &is_blocking ); ret = sock_is_blocking( s, &is_blocking );
if (status) if (!ret)
{ {
release_sock_fd( s, fd );
set_error( status );
return SOCKET_ERROR;
}
if (is_blocking) if (is_blocking)
{ {
int result;
/* block here */
do_block(fd, POLLIN | POLLOUT, -1); do_block(fd, POLLIN | POLLOUT, -1);
_sync_sock_state(s); /* let wineserver notice connection */ _sync_sock_state(s); /* let wineserver notice connection */
/* retrieve any error codes from it */ /* retrieve any error codes from it */
if (!(result = get_sock_error(s, FD_CONNECT_BIT))) goto connect_success; if (!(ret = get_sock_error(s, FD_CONNECT_BIT))) goto connect_success;
SetLastError(result);
} }
else else ret = WSAEWOULDBLOCK;
{
SetLastError(WSAEWOULDBLOCK);
} }
} }
else
{
SetLastError(ret);
}
release_sock_fd( s, fd ); release_sock_fd( s, fd );
SetLastError(ret);
} }
return SOCKET_ERROR; return SOCKET_ERROR;
@ -5667,11 +5656,7 @@ static int WS2_sendto( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
return 0; return 0;
} }
if ((err = _is_blocking( s, &is_blocking ))) if ((err = sock_is_blocking( s, &is_blocking ))) goto error;
{
err = NtStatusToWSAError( err );
goto error;
}
if ( is_blocking ) if ( is_blocking )
{ {
@ -8096,11 +8081,7 @@ static int WS2_recv_base( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
if (n != -1) break; if (n != -1) break;
if ((err = _is_blocking( s, &is_blocking ))) if ((err = sock_is_blocking( s, &is_blocking ))) goto error;
{
err = NtStatusToWSAError( err );
goto error;
}
if ( is_blocking ) if ( is_blocking )
{ {