X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Femail.c;h=6a1350f9edab96782d504409a2958263b59839a1;hb=7368bf2a94337b18b67a0c3573ddb2d71534ae8d;hp=8f633cd1d93e75224209d71017f48ff302bfb241;hpb=dff1246579ac6bea70331e560d2e1da0c7429b11;p=collectd.git diff --git a/src/email.c b/src/email.c index 8f633cd1..6a1350f9 100644 --- a/src/email.c +++ b/src/email.c @@ -251,8 +251,6 @@ static void *collect (void *arg) collector_t *this = (collector_t *)arg; while (1) { - int loop = 1; - conn_t *connection; pthread_mutex_lock (&conns_mutex); @@ -277,15 +275,13 @@ static void *collect (void *arg) log_debug ("collect: handling connection on fd #%i", fileno (this->socket)); - while (loop) { + while (42) { /* 256 bytes ought to be enough for anybody ;-) */ char line[256 + 1]; /* line + '\0' */ int len = 0; errno = 0; if (NULL == fgets (line, sizeof (line), this->socket)) { - loop = 0; - if (0 != errno) { char errbuf[1024]; log_err ("collect: reading from socket (fd #%i) " @@ -358,7 +354,7 @@ static void *collect (void *arg) else { log_err ("collect: unknown type '%c'", line[0]); } - } /* while (loop) */ + } /* while (42) */ log_debug ("Shutting down connection on fd #%i", fileno (this->socket)); @@ -509,28 +505,42 @@ static void *open_connection (void __attribute__((unused)) *arg) pthread_mutex_unlock (&available_mutex); - do { + while (42) { errno = 0; - if (-1 == (remote = accept (connector_socket, NULL, NULL))) { - if (EINTR != errno) { - char errbuf[1024]; - disabled = 1; - close (connector_socket); - connector_socket = -1; - log_err ("accept() failed: %s", - sstrerror (errno, errbuf, sizeof (errbuf))); - pthread_exit ((void *)1); - } + + remote = accept (connector_socket, NULL, NULL); + if (remote == -1) { + char errbuf[1024]; + + if (errno == EINTR) + continue; + + disabled = 1; + close (connector_socket); + connector_socket = -1; + log_err ("accept() failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + pthread_exit ((void *)1); } - } while (EINTR == errno); - connection = (conn_t *)smalloc (sizeof (conn_t)); + /* access() succeeded. */ + break; + } + + connection = malloc (sizeof (*connection)); + if (connection != NULL) + { + close (remote); + continue; + } + memset (connection, 0, sizeof (*connection)); connection->socket = fdopen (remote, "r"); connection->next = NULL; if (NULL == connection->socket) { close (remote); + sfree (connection); continue; } @@ -570,10 +580,27 @@ static int email_init (void) return (0); } /* int email_init */ -static int email_shutdown (void) +static void type_list_free (type_list_t *t) { - type_t *ptr = NULL; + type_t *this; + + this = t->head; + while (this != NULL) + { + type_t *next = this->next; + + sfree (this->name); + sfree (this); + this = next; + } + + t->head = NULL; + t->tail = NULL; +} + +static int email_shutdown (void) +{ int i = 0; if (connector != ((pthread_t) 0)) { @@ -613,35 +640,12 @@ static int email_shutdown (void) pthread_mutex_unlock (&conns_mutex); - for (ptr = list_count.head; NULL != ptr; ptr = ptr->next) { - free (ptr->name); - free (ptr); - } - - for (ptr = list_count_copy.head; NULL != ptr; ptr = ptr->next) { - free (ptr->name); - free (ptr); - } - - for (ptr = list_size.head; NULL != ptr; ptr = ptr->next) { - free (ptr->name); - free (ptr); - } - - for (ptr = list_size_copy.head; NULL != ptr; ptr = ptr->next) { - free (ptr->name); - free (ptr); - } - - for (ptr = list_check.head; NULL != ptr; ptr = ptr->next) { - free (ptr->name); - free (ptr); - } - - for (ptr = list_check_copy.head; NULL != ptr; ptr = ptr->next) { - free (ptr->name); - free (ptr); - } + type_list_free (&list_count); + type_list_free (&list_count_copy); + type_list_free (&list_size); + type_list_free (&list_size_copy); + type_list_free (&list_check); + type_list_free (&list_check_copy); unlink ((NULL == sock_file) ? SOCK_PATH : sock_file);