Handle socket POLLERR/POLLHUP conditions properly.
Clear error field for OOB notifications.
diff --git a/server/sock.c b/server/sock.c
index 531231b..5abe4ca 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -78,9 +78,19 @@
static void sock_reselect( struct sock *sock )
{
int ev = sock_get_poll_events( &sock->obj );
+ struct pollfd pfd;
+
if (debug_level)
fprintf(stderr,"sock_reselect(%d): new mask %x\n", sock->obj.fd, ev);
set_select_events( &sock->obj, ev );
+
+ /* check whether condition is satisfied already */
+ pfd.fd = sock->obj.fd;
+ pfd.events = ev;
+ pfd.revents = 0;
+ poll( &pfd, 1, 0 );
+ if (pfd.revents & (POLLIN|POLLOUT|POLLPRI))
+ sock_poll_event( &sock->obj, pfd.revents);
}
inline static int sock_error(int s)
@@ -163,6 +173,7 @@
{
sock->pmask |= FD_OOB;
sock->hmask |= FD_OOB;
+ sock->errors[FD_OOB_BIT] = 0;
if (debug_level)
fprintf(stderr, "socket %d got OOB data\n", sock->obj.fd);
}
@@ -178,7 +189,10 @@
}
}
- sock_reselect( sock );
+ if (event & (POLLERR|POLLHUP))
+ set_select_events( &sock->obj, -1 );
+ else
+ sock_reselect( sock );
/* wake up anyone waiting for whatever just happened */
emask = sock->pmask & sock->mask;
if (debug_level && emask)