X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Femail.c;h=ea4e7850138060891d132f5e3a46ecc6ca2cd35d;hb=65923b02496661196d79d3a565cab58a2b52f938;hp=8f633cd1d93e75224209d71017f48ff302bfb241;hpb=c7b0f0b0267f2ab7c84eea8306f0a516f5b8f769;p=collectd.git diff --git a/src/email.c b/src/email.c index 8f633cd1..ea4e7850 100644 --- a/src/email.c +++ b/src/email.c @@ -2,20 +2,25 @@ * collectd - src/email.c * Copyright (C) 2006-2008 Sebastian Harl * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; only version 2 of the License is applicable. + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. * - * Author: + * Authors: * Sebastian Harl **/ @@ -45,7 +50,6 @@ # include #endif -#include #include #include @@ -215,7 +219,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; @@ -232,7 +236,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); @@ -251,8 +255,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 +279,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) " @@ -305,8 +305,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 +332,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,19 +349,22 @@ 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]); } - } /* while (loop) */ + } /* while (42) */ log_debug ("Shutting down connection on fd #%i", fileno (this->socket)); @@ -383,8 +389,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; @@ -476,10 +482,10 @@ 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)); + collectors[i] = smalloc (sizeof (*collectors[i])); collectors[i]->socket = NULL; if (0 != (err = plugin_thread_create (&collectors[i]->thread, @@ -509,28 +515,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; } @@ -570,10 +589,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 +649,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); @@ -681,7 +694,7 @@ static void copy_type_list (type_list_t *l1, type_list_t *l2) for (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;