From: Zebediah Figura zfigura@codeweavers.com
Give sock_dispatch_events() a more consistent scope. --- server/sock.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/server/sock.c b/server/sock.c index b96f81a0ea8..1224c3b4674 100644 --- a/server/sock.c +++ b/server/sock.c @@ -1090,10 +1090,7 @@ static void sock_dispatch_events( struct sock *sock, enum connection_state prevs
case SOCK_CONNECTING: if (event & POLLOUT) - { post_socket_event( sock, AFD_POLL_BIT_CONNECT, 0 ); - sock->errors[AFD_POLL_BIT_CONNECT_ERR] = 0; - } if (event & (POLLERR | POLLHUP)) post_socket_event( sock, AFD_POLL_BIT_CONNECT_ERR, error ); break; @@ -1149,6 +1146,7 @@ static void sock_poll_event( struct fd *fd, int event ) { sock->state = SOCK_CONNECTED; sock->connect_time = current_time; + sock->errors[AFD_POLL_BIT_CONNECT_ERR] = 0; } break;
From: Zebediah Figura zfigura@codeweavers.com
As long as we do it for connecting and listening sockets, do it here for the remaining socket types as well. --- server/sock.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/server/sock.c b/server/sock.c index 1224c3b4674..373236cab56 100644 --- a/server/sock.c +++ b/server/sock.c @@ -645,20 +645,35 @@ static inline int sock_error( struct sock *sock ) socklen_t len = sizeof(error);
getsockopt( get_unix_fd(sock->fd), SOL_SOCKET, SO_ERROR, (void *)&error, &len); - if (sock->state == SOCK_CONNECTING) + + switch (sock->state) { + case SOCK_UNCONNECTED: + break; + + case SOCK_CONNECTING: if (error) sock->errors[AFD_POLL_BIT_CONNECT_ERR] = error; else error = sock->errors[AFD_POLL_BIT_CONNECT_ERR]; - } - else if (sock->state == SOCK_LISTENING) - { + break; + + case SOCK_LISTENING: if (error) sock->errors[AFD_POLL_BIT_ACCEPT] = error; else error = sock->errors[AFD_POLL_BIT_ACCEPT]; + break; + + case SOCK_CONNECTED: + case SOCK_CONNECTIONLESS: + if (error) + sock->errors[AFD_POLL_BIT_HUP] = error; + else + error = sock->errors[AFD_POLL_BIT_HUP]; + break; } + return error; }
From: Zebediah Figura zfigura@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52815 --- dlls/ws2_32/tests/afd.c | 3 ++- server/sock.c | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/dlls/ws2_32/tests/afd.c b/dlls/ws2_32/tests/afd.c index 9852d54ecb9..eb525c78c54 100644 --- a/dlls/ws2_32/tests/afd.c +++ b/dlls/ws2_32/tests/afd.c @@ -162,7 +162,8 @@ static void check_poll_(int line, SOCKET s, HANDLE event, int mask, int expect, ok_(__FILE__, line)(out_params.count == 1, "got count %u\n", out_params.count); ok_(__FILE__, line)(out_params.sockets[0].socket == s, "got socket %#Ix\n", out_params.sockets[0].socket); todo_wine_if (todo) ok_(__FILE__, line)(out_params.sockets[0].flags == expect, "got flags %#x\n", out_params.sockets[0].flags); - ok_(__FILE__, line)(!out_params.sockets[0].status, "got status %#x\n", out_params.sockets[0].status); + todo_wine_if (expect & AFD_POLL_RESET) + ok_(__FILE__, line)(!out_params.sockets[0].status, "got status %#x\n", out_params.sockets[0].status); }
static void test_poll(void) diff --git a/server/sock.c b/server/sock.c index 373236cab56..a8c0b56c2bc 100644 --- a/server/sock.c +++ b/server/sock.c @@ -1145,6 +1145,9 @@ static void sock_poll_event( struct fd *fd, int event ) if (debug_level) fprintf(stderr, "socket %p select event: %x\n", sock, event);
+ if (event & (POLLERR | POLLHUP)) + error = sock_error( sock ); + switch (sock->state) { case SOCK_UNCONNECTED: @@ -1153,7 +1156,6 @@ static void sock_poll_event( struct fd *fd, int event ) case SOCK_CONNECTING: if (event & (POLLERR|POLLHUP)) { - error = sock_error( sock ); sock->state = SOCK_UNCONNECTED; event &= ~POLLOUT; } @@ -1166,8 +1168,6 @@ static void sock_poll_event( struct fd *fd, int event ) break;
case SOCK_LISTENING: - if (event & (POLLERR|POLLHUP)) - error = sock_error( sock ); break;
case SOCK_CONNECTED:
From: Zebediah Figura zfigura@codeweavers.com
--- server/sock.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/server/sock.c b/server/sock.c index a8c0b56c2bc..53553ab8ee7 100644 --- a/server/sock.c +++ b/server/sock.c @@ -1084,7 +1084,7 @@ static int sock_dispatch_asyncs( struct sock *sock, int event, int error ) return event; }
-static void post_socket_event( struct sock *sock, enum afd_poll_bit event_bit, int error ) +static void post_socket_event( struct sock *sock, enum afd_poll_bit event_bit ) { unsigned int event = (1 << event_bit);
@@ -1092,11 +1092,10 @@ static void post_socket_event( struct sock *sock, enum afd_poll_bit event_bit, i { sock->pending_events |= event; sock->reported_events |= event; - sock->errors[event_bit] = error; } }
-static void sock_dispatch_events( struct sock *sock, enum connection_state prevstate, int event, int error ) +static void sock_dispatch_events( struct sock *sock, enum connection_state prevstate, int event ) { switch (prevstate) { @@ -1105,29 +1104,29 @@ static void sock_dispatch_events( struct sock *sock, enum connection_state prevs
case SOCK_CONNECTING: if (event & POLLOUT) - post_socket_event( sock, AFD_POLL_BIT_CONNECT, 0 ); + post_socket_event( sock, AFD_POLL_BIT_CONNECT ); if (event & (POLLERR | POLLHUP)) - post_socket_event( sock, AFD_POLL_BIT_CONNECT_ERR, error ); + post_socket_event( sock, AFD_POLL_BIT_CONNECT_ERR ); break;
case SOCK_LISTENING: if (event & (POLLIN | POLLERR | POLLHUP)) - post_socket_event( sock, AFD_POLL_BIT_ACCEPT, error ); + post_socket_event( sock, AFD_POLL_BIT_ACCEPT ); break;
case SOCK_CONNECTED: case SOCK_CONNECTIONLESS: if (event & POLLIN) - post_socket_event( sock, AFD_POLL_BIT_READ, 0 ); + post_socket_event( sock, AFD_POLL_BIT_READ );
if (event & POLLOUT) - post_socket_event( sock, AFD_POLL_BIT_WRITE, 0 ); + post_socket_event( sock, AFD_POLL_BIT_WRITE );
if (event & POLLPRI) - post_socket_event( sock, AFD_POLL_BIT_OOB, 0 ); + post_socket_event( sock, AFD_POLL_BIT_OOB );
if (event & (POLLERR | POLLHUP)) - post_socket_event( sock, AFD_POLL_BIT_HUP, error ); + post_socket_event( sock, AFD_POLL_BIT_HUP ); break; }
@@ -1194,6 +1193,7 @@ static void sock_poll_event( struct fd *fd, int event ) { error = errno; event |= POLLERR; + sock->errors[AFD_POLL_BIT_HUP] = error; if ( debug_level ) fprintf( stderr, "recv error on socket %p: %d\n", sock, errno ); } @@ -1218,7 +1218,7 @@ static void sock_poll_event( struct fd *fd, int event ) }
event = sock_dispatch_asyncs( sock, event, error ); - sock_dispatch_events( sock, prevstate, event, error ); + sock_dispatch_events( sock, prevstate, event ); complete_async_polls( sock, event, error );
sock_reselect( sock );