X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Femail.c;h=ea4e7850138060891d132f5e3a46ecc6ca2cd35d;hb=9d9678b9e753ea0936612021f4f87f8092ab4e31;hp=1bf9addaea09631f005ec96af2e97c9fdd602a56;hpb=7bab45b57d6ef99ae55c499c51478dd63c3b1397;p=collectd.git diff --git a/src/email.c b/src/email.c index 1bf9adda..334e8764 100644 --- a/src/email.c +++ b/src/email.c @@ -39,17 +39,12 @@ */ #include "collectd.h" + #include "common.h" #include "plugin.h" -#include "configfile.h" - #include -#if HAVE_LIBPTHREAD -# include -#endif - #include #include @@ -219,7 +214,7 @@ static int email_config (const char *key, const char *value) static void type_list_incr (type_list_t *list, char *name, int incr) { if (NULL == list->head) { - list->head = (type_t *)smalloc (sizeof (type_t)); + list->head = smalloc (sizeof (*list->head)); list->head->name = sstrdup (name); list->head->value = incr; @@ -236,7 +231,7 @@ static void type_list_incr (type_list_t *list, char *name, int incr) } if (NULL == ptr) { - list->tail->next = (type_t *)smalloc (sizeof (type_t)); + list->tail->next = smalloc (sizeof (*list->tail->next)); list->tail = list->tail->next; list->tail->name = sstrdup (name); @@ -305,8 +300,11 @@ static void *collect (void *arg) break; continue; } + if (len < 3) { /* [a-z] ':' '\n' */ + continue; + } - line[len - 1] = '\0'; + line[len - 1] = 0; log_debug ("collect: line = '%s'", line); @@ -329,12 +327,12 @@ static void *collect (void *arg) bytes = atoi (tmp); pthread_mutex_lock (&count_mutex); - type_list_incr (&list_count, type, 1); + type_list_incr (&list_count, type, /* increment = */ 1); pthread_mutex_unlock (&count_mutex); if (bytes > 0) { pthread_mutex_lock (&size_mutex); - type_list_incr (&list_size, type, bytes); + type_list_incr (&list_size, type, /* increment = */ bytes); pthread_mutex_unlock (&size_mutex); } } @@ -346,14 +344,17 @@ static void *collect (void *arg) pthread_mutex_unlock (&score_mutex); } else if ('c' == line[0]) { /* c:[,,...] */ - char *ptr = NULL; - char *type = strtok_r (line + 2, ",", &ptr); - - do { - pthread_mutex_lock (&check_mutex); - type_list_incr (&list_check, type, 1); - pthread_mutex_unlock (&check_mutex); - } while (NULL != (type = strtok_r (NULL, ",", &ptr))); + char *dummy = line + 2; + char *endptr = NULL; + char *type; + + pthread_mutex_lock (&check_mutex); + while ((type = strtok_r (dummy, ",", &endptr)) != NULL) + { + dummy = NULL; + type_list_incr (&list_check, type, /* increment = */ 1); + } + pthread_mutex_unlock (&check_mutex); } else { log_err ("collect: unknown type '%c'", line[0]); @@ -383,8 +384,8 @@ static void *open_connection (void __attribute__((unused)) *arg) { struct sockaddr_un addr; - char *path = (NULL == sock_file) ? SOCK_PATH : sock_file; - char *group = (NULL == sock_group) ? COLLECTD_GRP_NAME : sock_group; + const char *path = (NULL == sock_file) ? SOCK_PATH : sock_file; + const char *group = (NULL == sock_group) ? COLLECTD_GRP_NAME : sock_group; /* create UNIX socket */ errno = 0; @@ -462,9 +463,6 @@ static void *open_connection (void __attribute__((unused)) *arg) } { /* initialize collector threads */ - int i = 0; - int err = 0; - pthread_attr_t ptattr; conns.head = NULL; @@ -476,16 +474,17 @@ static void *open_connection (void __attribute__((unused)) *arg) available_collectors = max_conns; collectors = - (collector_t **)smalloc (max_conns * sizeof (collector_t *)); + smalloc (max_conns * sizeof (*collectors)); - for (i = 0; i < max_conns; ++i) { - collectors[i] = (collector_t *)smalloc (sizeof (collector_t)); + for (int i = 0; i < max_conns; ++i) { + collectors[i] = smalloc (sizeof (*collectors[i])); collectors[i]->socket = NULL; - if (0 != (err = plugin_thread_create (&collectors[i]->thread, - &ptattr, collect, collectors[i]))) { + if (plugin_thread_create (&collectors[i]->thread, + &ptattr, collect, collectors[i], + "email collector") != 0) { char errbuf[1024]; - log_err ("pthread_create() failed: %s", + log_err ("plugin_thread_create() failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); collectors[i]->thread = (pthread_t) 0; } @@ -509,28 +508,41 @@ 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 = calloc (1, sizeof (*connection)); + if (connection == NULL) + { + close (remote); + continue; + } connection->socket = fdopen (remote, "r"); connection->next = NULL; if (NULL == connection->socket) { close (remote); + sfree (connection); continue; } @@ -556,13 +568,11 @@ static void *open_connection (void __attribute__((unused)) *arg) static int email_init (void) { - int err = 0; - - if (0 != (err = plugin_thread_create (&connector, NULL, - open_connection, NULL))) { + if (plugin_thread_create (&connector, NULL, + open_connection, NULL, "email listener") != 0) { char errbuf[1024]; disabled = 1; - log_err ("pthread_create() failed: %s", + log_err ("plugin_thread_create() failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); return (-1); } @@ -591,8 +601,6 @@ static void type_list_free (type_list_t *t) static int email_shutdown (void) { - int i = 0; - if (connector != ((pthread_t) 0)) { pthread_kill (connector, SIGTERM); connector = (pthread_t) 0; @@ -609,7 +617,7 @@ static int email_shutdown (void) available_collectors = 0; if (collectors != NULL) { - for (i = 0; i < max_conns; ++i) { + for (int i = 0; i < max_conns; ++i) { if (collectors[i] == NULL) continue; @@ -646,14 +654,10 @@ static int email_shutdown (void) static void email_submit (const char *type, const char *type_instance, gauge_t value) { - value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - values[0].gauge = value; - - vl.values = values; + vl.values = &(value_t) { .gauge = value }; vl.values_len = 1; - sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "email", sizeof (vl.plugin)); sstrncpy (vl.type, type, sizeof (vl.type)); sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); @@ -667,15 +671,12 @@ static void email_submit (const char *type, const char *type_instance, gauge_t v * after they have been copied to l2. */ static void copy_type_list (type_list_t *l1, type_list_t *l2) { - type_t *ptr1; - type_t *ptr2; - type_t *last = NULL; - for (ptr1 = l1->head, ptr2 = l2->head; NULL != ptr1; + for (type_t *ptr1 = l1->head, *ptr2 = l2->head; NULL != ptr1; ptr1 = ptr1->next, last = ptr2, ptr2 = ptr2->next) { if (NULL == ptr2) { - ptr2 = (type_t *)smalloc (sizeof (type_t)); + ptr2 = smalloc (sizeof (*ptr2)); ptr2->name = NULL; ptr2->next = NULL; @@ -701,8 +702,6 @@ static void copy_type_list (type_list_t *l1, type_list_t *l2) static int email_read (void) { - type_t *ptr; - double score_old; int score_count_old; @@ -716,7 +715,7 @@ static int email_read (void) pthread_mutex_unlock (&count_mutex); - for (ptr = list_count_copy.head; NULL != ptr; ptr = ptr->next) { + for (type_t *ptr = list_count_copy.head; NULL != ptr; ptr = ptr->next) { email_submit ("email_count", ptr->name, ptr->value); } @@ -727,7 +726,7 @@ static int email_read (void) pthread_mutex_unlock (&size_mutex); - for (ptr = list_size_copy.head; NULL != ptr; ptr = ptr->next) { + for (type_t *ptr = list_size_copy.head; NULL != ptr; ptr = ptr->next) { email_submit ("email_size", ptr->name, ptr->value); } @@ -751,7 +750,7 @@ static int email_read (void) pthread_mutex_unlock (&check_mutex); - for (ptr = list_check_copy.head; NULL != ptr; ptr = ptr->next) + for (type_t *ptr = list_check_copy.head; NULL != ptr; ptr = ptr->next) email_submit ("spam_check", ptr->name, ptr->value); return (0);