+
+ /* Handle any existing connections. */
+ for (i = 0; i < nclients; i++)
+ {
+ cur_client = clients[i];
+
+ if (FD_ISSET(clients[i]->con, &writefds))
+ {
+ client_write(clients[i]);
+ if (!clients[i]->ntuples)
+ {
+ FD_CLR(clients[i]->con, &xwritefds);
+ FD_SET(clients[i]->con, &xreadfds);
+ }
+ clients[i]->last_time_used = now;
+ }
+
+ if (FD_ISSET(clients[i]->con, &readfds))
+ {
+ if (clients[i]->state == CL_ACCEPTING)
+ {
+ switch(mr_cont_accept(clients[i]->con,
+ &clients[i]->hsbuf,
+ &clients[i]->hslen))
+ {
+ case -1:
+ break;
+
+ case 0:
+ clients[i]->state = CL_CLOSING;
+ break;
+
+ default:
+ clients[i]->state = CL_ACTIVE;
+ clients[i]->hsbuf = NULL;
+ break;
+ }
+ }
+ else
+ {
+ client_read(clients[i]);
+ if (clients[i]->ntuples)
+ {
+ FD_CLR(clients[i]->con, &xreadfds);
+ FD_SET(clients[i]->con, &xwritefds);
+ }
+ clients[i]->last_time_used = now;
+ }
+ }
+
+ if (clients[i]->last_time_used < tardy)
+ {
+ com_err(whoami, 0, "Shutting down connection due to inactivity");
+ clients[i]->state = CL_CLOSING;
+ }
+
+ if (clients[i]->state == CL_CLOSING)
+ {
+ client *old;
+
+ com_err(whoami, 0, "Closed connection (now %d client%s, "
+ "%d queries)", nclients - 1, nclients != 2 ? "s" : "",
+ newqueries);
+
+ shutdown(clients[i]->con, 2);
+ close(clients[i]->con);
+ FD_CLR(clients[i]->con, &xreadfds);
+ FD_CLR(clients[i]->con, &xwritefds);
+ free_rtn_tuples(clients[i]);
+ free(clients[i]->tuples);
+ free(clients[i]->hsbuf);
+ old = clients[i];
+ clients[i] = clients[--nclients];
+ free(old);
+ }
+
+ cur_client = NULL;
+ if (takedown)
+ break;