X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrdd.c;h=6b382dff54a70fb426c78c93628a773617df3154;hb=9f1fa4f0bf9b0a9f4eef413720238e04c2c5ff12;hp=a9a1e0593e360d3d582ffebe56a174ac2e359804;hpb=70a037337b955840904a4d78ed45a67ce24aa8ac;p=rrdd.git diff --git a/src/rrdd.c b/src/rrdd.c index a9a1e05..6b382df 100644 --- a/src/rrdd.c +++ b/src/rrdd.c @@ -29,8 +29,6 @@ # define RRDD_LOG(severity, ...) syslog ((severity), __VA_ARGS__) #endif -#define DEFAULT_PORT "42217" - /* * Types */ @@ -506,8 +504,9 @@ static int open_listen_socket_unix (const char *path) /* {{{ */ } listen_fds[listen_fds_num].fd = fd; - strncpy (listen_fds[listen_fds_num].path, path, - sizeof (listen_fds[listen_fds_num].path) - 1); + snprintf (listen_fds[listen_fds_num].path, + sizeof (listen_fds[listen_fds_num].path) - 1, + "unix:%s", path); listen_fds_num++; return (0); @@ -547,7 +546,6 @@ static int open_listen_socket (const char *addr) /* {{{ */ for (ai_ptr = ai_res; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next) { int fd; - struct sockaddr_storage sa; listen_socket_t *temp; temp = (listen_socket_t *) realloc (listen_fds, @@ -599,7 +597,8 @@ static int close_listen_sockets (void) /* {{{ */ for (i = 0; i < listen_fds_num; i++) { close (listen_fds[i].fd); - unlink (listen_fds[i].path); + if (strncmp ("unix:", listen_fds[i].path, strlen ("unix:")) == 0) + unlink (listen_fds[i].path + strlen ("unix:")); } free (listen_fds); @@ -612,6 +611,8 @@ static int close_listen_sockets (void) /* {{{ */ static void *listen_thread_main (void *args) /* {{{ */ { char buffer[4096]; + struct pollfd *pollfds; + int pollfds_num; int status; int i; @@ -622,6 +623,9 @@ static void *listen_thread_main (void *args) /* {{{ */ open_listen_socket (config_listen_address_list[i]); } + if (config_listen_address_list_len < 1) + open_listen_socket (RRDD_SOCK_PATH); + if (listen_fds_num < 1) { RRDD_LOG (LOG_ERR, "listen_thread_main: No listen sockets " @@ -629,47 +633,87 @@ static void *listen_thread_main (void *args) /* {{{ */ return (NULL); } - while (do_shutdown == 0) + pollfds_num = listen_fds_num; + pollfds = (struct pollfd *) malloc (sizeof (*pollfds) * pollfds_num); + if (pollfds == NULL) { - int *client_sd; - struct sockaddr_storage client_sa; - socklen_t client_sa_size; - pthread_t tid; + RRDD_LOG (LOG_ERR, "listen_thread_main: malloc failed."); + return (NULL); + } + memset (pollfds, 0, sizeof (*pollfds) * pollfds_num); - client_sd = (int *) malloc (sizeof (int)); - if (client_sd == NULL) + while (do_shutdown == 0) + { + assert (pollfds_num == listen_fds_num); + for (i = 0; i < pollfds_num; i++) { - RRDD_LOG (LOG_ERR, "listen_thread_main: malloc failed."); - sleep (120); - continue; + pollfds[i].fd = listen_fds[i].fd; + pollfds[i].events = POLLIN | POLLPRI; + pollfds[i].revents = 0; } - client_sa_size = sizeof (client_sa); - /* FIXME: Don't implement listen_fds as a list or use poll(2) here! */ - *client_sd = accept (listen_fds[0].fd, - (struct sockaddr *) &client_sa, &client_sa_size); - if (*client_sd < 0) + status = poll (pollfds, pollfds_num, /* timeout = */ -1); + if (status < 1) { - RRDD_LOG (LOG_ERR, "listen_thread_main: accept(2) failed."); + status = errno; + if (status != EINTR) + { + RRDD_LOG (LOG_ERR, "listen_thread_main: poll(2) failed."); + } continue; } - RRDD_LOG (LOG_DEBUG, "listen_thread_main: accept(2) returned fd #%i.", - *client_sd); - - status = pthread_create (&tid, /* attr = */ NULL, connection_thread_main, - /* args = */ (void *) client_sd); - if (status != 0) + for (i = 0; i < pollfds_num; i++) { - RRDD_LOG (LOG_ERR, "listen_thread_main: pthread_create failed."); - close (*client_sd); - free (client_sd); - continue; - } + int *client_sd; + struct sockaddr_storage client_sa; + socklen_t client_sa_size; + pthread_t tid; + + if (pollfds[i].revents == 0) + continue; + + if ((pollfds[i].revents & (POLLIN | POLLPRI)) == 0) + { + RRDD_LOG (LOG_ERR, "listen_thread_main: " + "poll(2) returned something unexpected for listen FD #%i.", + pollfds[i].fd); + continue; + } + + client_sd = (int *) malloc (sizeof (int)); + if (client_sd == NULL) + { + RRDD_LOG (LOG_ERR, "listen_thread_main: malloc failed."); + continue; + } + + client_sa_size = sizeof (client_sa); + *client_sd = accept (pollfds[i].fd, + (struct sockaddr *) &client_sa, &client_sa_size); + if (*client_sd < 0) + { + RRDD_LOG (LOG_ERR, "listen_thread_main: accept(2) failed."); + continue; + } + + RRDD_LOG (LOG_DEBUG, "listen_thread_main: accept(2) returned fd #%i.", + *client_sd); + + status = pthread_create (&tid, /* attr = */ NULL, connection_thread_main, + /* args = */ (void *) client_sd); + if (status != 0) + { + RRDD_LOG (LOG_ERR, "listen_thread_main: pthread_create failed."); + close (*client_sd); + free (client_sd); + continue; + } - RRDD_LOG (LOG_DEBUG, "listen_thread_main: pthread_create succeeded: " - "tid = %lu", - *((unsigned long *) &tid)); + RRDD_LOG (LOG_DEBUG, "listen_thread_main: pthread_create succeeded: " + "tid = %lu", + *((unsigned long *) &tid)); + } /* for (pollfds_num) */ } /* while (do_shutdown == 0) */ close_listen_sockets ();