From 9db29cde3a13e51dc7f956319d9f3b625c2fb991 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 27 Jun 1998 17:16:24 +0000 Subject: (handle_new_request): Handle POLLHUP correctly. (close_sockets): Correct parameter to dbg_log. --- nscd/connections.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'nscd') diff --git a/nscd/connections.c b/nscd/connections.c index 63deac5..7fdafe1 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -62,7 +62,7 @@ close_sockets (void) if (sock[i] != 0) { if (close (sock[i])) - dbg_log (_("socket [%d|%d] close: %s"), strerror (errno)); + dbg_log (_("socket [%d|%d] close: %s"), i, sock[i], strerror (errno)); sock[i] = 0; read_polls[i].fd = -1; @@ -122,7 +122,7 @@ handle_new_connection (void) else { int black_widow_sock; - dbg_log (_("Supported number of simultainious connections exceeded")); + dbg_log (_("Supported number of simultaneous connections exceeded")); dbg_log (_("Ignoring client connect request")); /* There has to be a better way to ignore a connection request,.. when I get my hands on a sockets wiz I'll modify this. */ @@ -137,15 +137,32 @@ static int handle_new_request (int **connp, request_header **reqp, char **key) { ssize_t nbytes; - int i; + int i, found = 0; if (debug_flag) dbg_log ("handle_new_request"); /* Find the descriptor. */ - for (i = 1; i < MAX_NUM_CONNECTIONS; ++i) - if (read_polls[i].revents & (POLLRDNORM|POLLERR)) - break; + for (i = 1; i < MAX_NUM_CONNECTIONS; ++i) { + if (read_polls[i].fd >= 0 + && read_polls[i].revents & (POLLRDNORM|POLLERR|POLLNVAL)) + { + found = i; + break; + } + if (read_polls[i].fd >= 0 && (read_polls[i].revents & POLLHUP)) + { + /* Don't close the socket, we still need to send data. Just + stop polling for more data now. */ + read_polls[i].fd = -1; + } + } + + if (found == 0) + { + dbg_log (_("No sockets with data found !")); + return -1; + } if (debug_flag > 2) dbg_log (_("handle_new_request uses socket %d"), i); @@ -244,7 +261,7 @@ get_request (int *conn, request_header *req, char **key) perror (_("Poll new reads")); exit (1); } - if (read_polls[0].revents & (POLLRDNORM|POLLERR)) + if (read_polls[0].revents & (POLLRDNORM|POLLERR|POLLHUP|POLLNVAL)) /* Handle the case of a new connection request on the named socket. */ handle_new_connection (); else -- cgit v1.1