diff --git a/src/email.c b/src/email.c
index e208f13049f168cbc08775366d5e01f7523c1982..ea4e7850138060891d132f5e3a46ecc6ca2cd35d 100644 (file)
--- a/src/email.c
+++ b/src/email.c
* collectd - src/email.c
* Copyright (C) 2006-2008 Sebastian Harl
*
* 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 <sh at tokkee.org>
**/
* Sebastian Harl <sh at tokkee.org>
**/
# include <pthread.h>
#endif
# include <pthread.h>
#endif
-#include <sys/socket.h>
#include <sys/un.h>
#include <sys/select.h>
#include <sys/un.h>
#include <sys/select.h>
fprintf (stderr, "email plugin: `MaxConns' was set to invalid "
"value %li, will use default %i.\n",
tmp, MAX_CONNS);
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);
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 {
max_conns = MAX_CONNS_LIMIT;
}
else {
static void type_list_incr (type_list_t *list, char *name, int incr)
{
if (NULL == list->head) {
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;
list->head->name = sstrdup (name);
list->head->value = incr;
}
if (NULL == ptr) {
}
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);
list->tail = list->tail->next;
list->tail->name = sstrdup (name);
collector_t *this = (collector_t *)arg;
while (1) {
collector_t *this = (collector_t *)arg;
while (1) {
- int loop = 1;
-
conn_t *connection;
pthread_mutex_lock (&conns_mutex);
conn_t *connection;
pthread_mutex_lock (&conns_mutex);
log_debug ("collect: handling connection on fd #%i",
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)) {
/* 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) "
if (0 != errno) {
char errbuf[1024];
log_err ("collect: reading from socket (fd #%i) "
break;
continue;
}
break;
continue;
}
+ if (len < 3) { /* [a-z] ':' '\n' */
+ continue;
+ }
- line[len - 1] = '\0';
+ line[len - 1] = 0;
log_debug ("collect: line = '%s'", line);
log_debug ("collect: line = '%s'", line);
bytes = atoi (tmp);
pthread_mutex_lock (&count_mutex);
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);
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);
}
}
pthread_mutex_unlock (&size_mutex);
}
}
pthread_mutex_unlock (&score_mutex);
}
else if ('c' == line[0]) { /* c:<type1>[,<type2>,...] */
pthread_mutex_unlock (&score_mutex);
}
else if ('c' == line[0]) { /* c:<type1>[,<type2>,...] */
- 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]);
}
}
else {
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);
fclose (connection->socket);
free (connection);
} /* while (1) */
pthread_exit ((void *)0);
} /* while (1) */
pthread_exit ((void *)0);
+ return ((void *) 0);
} /* static void *collect (void *) */
} /* static void *collect (void *) */
-static void *open_connection (void *arg)
+static void *open_connection (void __attribute__((unused)) *arg)
{
struct sockaddr_un addr;
{
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;
/* create UNIX socket */
errno = 0;
available_collectors = max_conns;
collectors =
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) {
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;
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)));
char errbuf[1024];
log_err ("pthread_create() failed: %s",
sstrerror (errno, errbuf, sizeof (errbuf)));
pthread_mutex_unlock (&available_mutex);
pthread_mutex_unlock (&available_mutex);
- do {
+ while (42) {
errno = 0;
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);
connection->socket = fdopen (remote, "r");
connection->next = NULL;
if (NULL == connection->socket) {
close (remote);
+ sfree (connection);
continue;
}
continue;
}
pthread_cond_signal (&conn_available);
}
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;
} /* 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;
open_connection, NULL))) {
char errbuf[1024];
disabled = 1;
return (0);
} /* int email_init */
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)) {
int i = 0;
if (connector != ((pthread_t) 0)) {
pthread_mutex_unlock (&conns_mutex);
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);
unlink ((NULL == sock_file) ? SOCK_PATH : sock_file);
@@ -650,7 +672,6 @@ static void email_submit (const char *type, const char *type_instance, gauge_t v
vl.values = values;
vl.values_len = 1;
vl.values = values;
vl.values_len = 1;
- vl.time = time (NULL);
sstrncpy (vl.host, hostname_g, sizeof (vl.host));
sstrncpy (vl.plugin, "email", sizeof (vl.plugin));
sstrncpy (vl.type, type, sizeof (vl.type));
sstrncpy (vl.host, hostname_g, sizeof (vl.host));
sstrncpy (vl.plugin, "email", sizeof (vl.plugin));
sstrncpy (vl.type, type, sizeof (vl.type));
for (ptr1 = l1->head, ptr2 = l2->head; NULL != ptr1;
ptr1 = ptr1->next, last = ptr2, ptr2 = ptr2->next) {
if (NULL == ptr2) {
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;
ptr2->name = NULL;
ptr2->next = NULL;