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; }