X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Femail.c;h=ca4dbc2c34706405b7626be0e882559fef3d947c;hb=daa5c7a886b4406d5b8bfdbecd6f998f9ca07fea;hp=87daed113273227cfd3f82601fea5421159e6b67;hpb=d22aee658210cbfa44caa39f302aa9331d4eab82;p=collectd.git diff --git a/src/email.c b/src/email.c index 87daed11..ca4dbc2c 100644 --- a/src/email.c +++ b/src/email.c @@ -187,12 +187,18 @@ static int email_config (const char *key, const char *value) fprintf (stderr, "email plugin: `MaxConns' was set to invalid " "value %li, will use default %i.\n", tmp, MAX_CONNS); + ERROR ("email plugin: `MaxConns' was set to invalid " + "value %li, will use default %i.\n", + tmp, MAX_CONNS); max_conns = MAX_CONNS; } else if (tmp > MAX_CONNS_LIMIT) { fprintf (stderr, "email plugin: `MaxConns' was set to invalid " "value %li, will use hardcoded limit %i.\n", tmp, MAX_CONNS_LIMIT); + ERROR ("email plugin: `MaxConns' was set to invalid " + "value %li, will use hardcoded limit %i.\n", + tmp, MAX_CONNS_LIMIT); max_conns = MAX_CONNS_LIMIT; } else { @@ -243,11 +249,8 @@ static void type_list_incr (type_list_t *list, char *name, int incr) static void *collect (void *arg) { collector_t *this = (collector_t *)arg; - pthread_t self = pthread_self (); while (1) { - int loop = 1; - conn_t *connection; pthread_mutex_lock (&conns_mutex); @@ -269,22 +272,20 @@ static void *collect (void *arg) * thread and connection management */ this->socket = connection->socket; - log_debug ("[thread #%5lu] handling connection on fd #%i", - self, fileno (this->socket)); + 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 ("[thread #%5lu] reading from socket (fd #%i) " - "failed: %s", self, fileno (this->socket), + log_err ("collect: reading from socket (fd #%i) " + "failed: %s", fileno (this->socket), sstrerror (errno, errbuf, sizeof (errbuf))); } break; @@ -292,22 +293,24 @@ static void *collect (void *arg) len = strlen (line); if (('\n' != line[len - 1]) && ('\r' != line[len - 1])) { - log_warn ("[thread #%5lu] line too long (> %i characters): " - "'%s' (truncated)", self, sizeof (line) - 1, line); + log_warn ("collect: line too long (> %zu characters): " + "'%s' (truncated)", sizeof (line) - 1, line); while (NULL != fgets (line, sizeof (line), this->socket)) if (('\n' == line[len - 1]) || ('\r' == line[len - 1])) break; continue; } + if (len < 3) { /* [a-z] ':' '\n' */ + continue; + } - line[len - 1] = '\0'; + line[len - 1] = 0; - log_debug ("[thread #%5lu] line = '%s'", self, line); + log_debug ("collect: line = '%s'", line); if (':' != line[1]) { - log_err ("[thread #%5lu] syntax error in line '%s'", - self, line); + log_err ("collect: syntax error in line '%s'", line); continue; } @@ -318,20 +321,19 @@ static void *collect (void *arg) int bytes = 0; if (NULL == tmp) { - log_err ("[thread #%5lu] syntax error in line '%s'", - self, line); + log_err ("collect: syntax error in line '%s'", line); continue; } 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); } } @@ -343,22 +345,25 @@ 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 ("[thread #%5lu] unknown type '%c'", self, line[0]); + log_err ("collect: unknown type '%c'", line[0]); } - } /* while (loop) */ + } /* while (42) */ - log_debug ("[thread #%5lu] shutting down connection on fd #%i", - pthread_self (), fileno (this->socket)); + log_debug ("Shutting down connection on fd #%i", + fileno (this->socket)); fclose (connection->socket); free (connection); @@ -373,9 +378,10 @@ static void *collect (void *arg) } /* while (1) */ pthread_exit ((void *)0); + return ((void *) 0); } /* static void *collect (void *) */ -static void *open_connection (void *arg) +static void *open_connection (void __attribute__((unused)) *arg) { struct sockaddr_un addr; @@ -393,10 +399,7 @@ static void *open_connection (void *arg) } addr.sun_family = AF_UNIX; - - strncpy (addr.sun_path, path, (size_t)(UNIX_PATH_MAX - 1)); - addr.sun_path[UNIX_PATH_MAX - 1] = '\0'; - unlink (addr.sun_path); + sstrncpy (addr.sun_path, path, (size_t)(UNIX_PATH_MAX - 1)); errno = 0; if (-1 == bind (connector_socket, (struct sockaddr *)&addr, @@ -481,8 +484,8 @@ static void *open_connection (void *arg) collectors[i] = (collector_t *)smalloc (sizeof (collector_t)); collectors[i]->socket = NULL; - if (0 != (err = pthread_create (&collectors[i]->thread, &ptattr, - collect, collectors[i]))) { + if (0 != (err = plugin_thread_create (&collectors[i]->thread, + &ptattr, collect, collectors[i]))) { char errbuf[1024]; log_err ("pthread_create() failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); @@ -508,28 +511,42 @@ static void *open_connection (void *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; } @@ -548,14 +565,16 @@ static void *open_connection (void *arg) pthread_cond_signal (&conn_available); } - pthread_exit ((void *)0); + + pthread_exit ((void *) 0); + return ((void *) 0); } /* static void *open_connection (void *) */ static int email_init (void) { int err = 0; - if (0 != (err = pthread_create (&connector, NULL, + if (0 != (err = plugin_thread_create (&connector, NULL, open_connection, NULL))) { char errbuf[1024]; disabled = 1; @@ -567,10 +586,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)) { @@ -610,35 +646,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); @@ -656,12 +669,12 @@ static void email_submit (const char *type, const char *type_instance, gauge_t v vl.values = values; vl.values_len = 1; - vl.time = time (NULL); - strcpy (vl.host, hostname_g); - strcpy (vl.plugin, "email"); - strncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); + 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)); - plugin_dispatch_values (type, &vl); + plugin_dispatch_values (&vl); } /* void email_submit */ /* Copy list l1 to list l2. l2 may partly exist already, but it is assumed