diff --git a/src/fdevent.c b/src/fdevent.c index 7deda395..fdf834fc 100644 --- a/src/fdevent.c +++ b/src/fdevent.c @@ -185,7 +185,7 @@ int fdevent_fcntl_set(fdevents *ev, int fd) { /* close fd on exec (cgi) */ fcntl(fd, F_SETFD, FD_CLOEXEC); #endif - if (ev->fcntl_set) return ev->fcntl_set(ev, fd); + if ((ev) && (ev->fcntl_set)) return ev->fcntl_set(ev, fd); #ifdef O_NONBLOCK return fcntl(fd, F_SETFL, O_NONBLOCK | O_RDWR); #else diff --git a/src/network.c b/src/network.c index 4ad27018..22a502cc 100644 --- a/src/network.c +++ b/src/network.c @@ -159,11 +159,6 @@ int network_server_init(server *srv, buffer *host_token, specific_config *s) { return -1; } - if (-1 == fdevent_fcntl_set(srv->ev, srv_socket->fd)) { - log_error_write(srv, __FILE__, __LINE__, "ss", "fcntl failed:", strerror(errno)); - return -1; - } - switch(srv_socket->addr.plain.sa_family) { #ifdef HAVE_IPV6 case AF_INET6: diff --git a/src/server.c b/src/server.c index 895dea94..de098013 100644 --- a/src/server.c +++ b/src/server.c @@ -529,11 +529,6 @@ int main (int argc, char **argv) { } } - if (NULL == (srv->ev = fdevent_init(srv->max_fds + 1, srv->event_handler))) { - log_error_write(srv, __FILE__, __LINE__, - "s", "fdevent_init failed"); - return -1; - } #ifdef HAVE_PWD_H /* set user and group */ @@ -620,13 +615,6 @@ int main (int argc, char **argv) { return -1; } } - - - if (NULL == (srv->ev = fdevent_init(srv->max_fds + 1, srv->event_handler))) { - log_error_write(srv, __FILE__, __LINE__, - "s", "fdevent_init failed"); - return -1; - } if (0 != network_init(srv)) { plugins_free(srv); @@ -728,22 +716,6 @@ int main (int argc, char **argv) { return -1; } - /* - * kqueue() is called here, select resets its internals, - * all server sockets get their handlers - * - * */ - if (0 != network_register_fdevents(srv)) { - plugins_free(srv); - network_close(srv); - server_free(srv); - - return -1; - } - - /* get the current number of FDs */ - srv->cur_fds = open("/dev/null", O_RDONLY); - close(srv->cur_fds); #ifdef HAVE_SIGACTION memset(&act, 0, sizeof(act)); @@ -836,6 +808,36 @@ int main (int argc, char **argv) { } #endif + if (NULL == (srv->ev = fdevent_init(srv->max_fds + 1, srv->event_handler))) { + log_error_write(srv, __FILE__, __LINE__, + "s", "fdevent_init failed"); + return -1; + } + /* + * kqueue() is called here, select resets its internals, + * all server sockets get their handlers + * + * */ + if (0 != network_register_fdevents(srv)) { + plugins_free(srv); + network_close(srv); + server_free(srv); + + return -1; + } + + /* get the current number of FDs */ + srv->cur_fds = open("/dev/null", O_RDONLY); + close(srv->cur_fds); + + for (i = 0; i < srv->srv_sockets.used; i++) { + server_socket *srv_socket = srv->srv_sockets.ptr[i]; + if (-1 == fdevent_fcntl_set(srv->ev, srv_socket->fd)) { + log_error_write(srv, __FILE__, __LINE__, "ss", "fcntl failed:", strerror(errno)); + return -1; + } + } + /* main-loop */ while (!srv_shutdown) { int n;