/* * Shutdown server */ void server_shutdown(server_t *srv) { record_t *r; int fd; assert(srv != NULL); while ((r = LIST_FIRST(&srv->rlist)) != NULL) { LIST_REMOVE(r, next); free(r); } for (fd = 0; fd < srv->fdmax + 1; fd ++) { if (srv->fdidx[fd].valid) server_close_fd(srv, fd); } free(srv->fdidx); free(srv->ctlbuf); free(srv->ibuf); free(srv->obuf); memset(srv, 0, sizeof(*srv)); }
void server_shutdown(server_p srv) { int fd; assert(srv != NULL); for (fd = 0; fd < srv->maxfd + 1; fd ++) if (srv->fdidx[fd].valid) server_close_fd(srv, fd); free(srv->req); free(srv->fdidx); memset(srv, 0, sizeof(*srv)); }
int32_t server_do(server_p srv) { fd_set fdset; int32_t n, fd; assert(srv != NULL); /* Copy cached version of the fd set and call select */ memcpy(&fdset, &srv->fdset, sizeof(fdset)); n = select(srv->maxfd + 1, &fdset, NULL, NULL, NULL); if (n < 0) { if (errno == EINTR) return (0); log_err("Could not select(%d, %p). %s (%d)", srv->maxfd + 1, &fdset, strerror(errno), errno); return (-1); } /* Process descriptors */ for (fd = 0; fd < srv->maxfd + 1 && n > 0; fd ++) { if (!FD_ISSET(fd, &fdset)) continue; assert(srv->fdidx[fd].valid); n --; if (srv->fdidx[fd].server) server_accept_client(srv, fd); else if (server_process_request(srv, fd) != 0) server_close_fd(srv, fd); } return (0); }
/* * Do one server iteration */ bool server_do(server_t *srv) { fd_set fdset; int n, fd; assert(srv != NULL); memcpy(&fdset, &srv->fdset, sizeof(fdset)); n = select(srv->fdmax + 1, &fdset, NULL, NULL, NULL); if (n == -1) { if (errno == EINTR) return true; log_err("Could not select(%d, %p). %s (%d)", srv->fdmax + 1, &fdset, strerror(errno), errno); return false; } for (fd = 0; fd < srv->fdmax + 1 && n > 0; fd++) { if (!FD_ISSET(fd, &fdset)) continue; assert(srv->fdidx[fd].valid); if (srv->fdidx[fd].server) server_accept_client(srv, fd); else if (!server_process_request(srv, fd)) server_close_fd(srv, fd); n--; } return true; }