#define MAX_CONNS 5
#define MAX_CONNS_LIMIT 16384
-#define log_err(...) syslog (LOG_ERR, MODULE_NAME": "__VA_ARGS__)
-#define log_warn(...) syslog (LOG_WARNING, MODULE_NAME": "__VA_ARGS__)
+#define log_err(...) ERROR (MODULE_NAME": "__VA_ARGS__)
+#define log_warn(...) WARNING (MODULE_NAME": "__VA_ARGS__)
/*
* Private data structures
};
static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
-static data_source_t gauge_dsrc[1] =
-{
- {"value", DS_TYPE_GAUGE, 0.0, NAN}
-};
-
-static data_set_t email_count_ds =
-{
- "email_count", 1, gauge_dsrc
-};
-
-static data_set_t email_size_ds =
-{
- "email_size", 1, gauge_dsrc
-};
-
-static data_set_t spam_check_ds =
-{
- "spam_check", 1, gauge_dsrc
-};
-
-static data_source_t spam_score_dsrc[1] =
-{
- {"score", DS_TYPE_GAUGE, NAN, NAN}
-};
-
-static data_set_t spam_score_ds =
-{
- "spam_score", 1, spam_score_dsrc
-};
-
/* socket configuration */
static char *sock_group = COLLECTD_GRP_NAME;
static int sock_perms = S_IRWXU | S_IRWXG;
static int disabled = 0;
/* thread managing "client" connections */
-static pthread_t connector;
-static int connector_socket;
+static pthread_t connector = (pthread_t) 0;
+static int connector_socket = -1;
/* tell the collector threads that a new connection is available */
static pthread_cond_t conn_available = PTHREAD_COND_INITIALIZER;
static pthread_cond_t collector_available = PTHREAD_COND_INITIALIZER;
/* collector threads */
-static collector_t **collectors;
+static collector_t **collectors = NULL;
static pthread_mutex_t available_mutex = PTHREAD_MUTEX_INITIALIZER;
static int available_collectors;
FD_SET (src->socket, &fdset);
if (-1 == select (src->socket + 1, &fdset, NULL, NULL, NULL)) {
- log_err ("select() failed: %s", strerror (errno));
+ char errbuf[1024];
+ log_err ("select() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
return '\0';
}
errno = 0;
if (0 > (len = read (src->socket, (void *)&ret, 1))) {
if (EINTR != errno) {
- log_err ("read() failed: %s", strerror (errno));
+ char errbuf[1024];
+ log_err ("read() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
return '\0';
}
}
FD_SET (src->socket, &fdset);
if (-1 == select (src->socket + 1, &fdset, NULL, NULL, NULL)) {
- log_err ("select() failed: %s", strerror (errno));
+ char errbuf[1024];
+ log_err ("select() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
return NULL;
}
(void *)(src->buffer + src->idx),
BUFSIZE - src->idx))) {
if (EINTR != errno) {
- log_err ("read() failed: %s", strerror (errno));
+ char errbuf[1024];
+ log_err ("read() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
return NULL;
}
}
errno = 0;
if (-1 == fcntl (connection->socket, F_GETFL, &flags)) {
- log_err ("fcntl() failed: %s", strerror (errno));
+ char errbuf[1024];
+ log_err ("fcntl() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
loop = 0;
}
errno = 0;
if (-1 == fcntl (connection->socket, F_SETFL, flags | O_NONBLOCK)) {
- log_err ("fcntl() failed: %s", strerror (errno));
+ char errbuf[1024];
+ log_err ("fcntl() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
loop = 0;
}
}
} /* while (loop) */
close (connection->socket);
-
free (connection);
+ this->socket = -1;
+
pthread_mutex_lock (&available_mutex);
++available_collectors;
pthread_mutex_unlock (&available_mutex);
/* create UNIX socket */
errno = 0;
if (-1 == (connector_socket = socket (PF_UNIX, SOCK_STREAM, 0))) {
+ char errbuf[1024];
disabled = 1;
- log_err ("socket() failed: %s", strerror (errno));
+ log_err ("socket() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
pthread_exit ((void *)1);
}
if (-1 == bind (connector_socket, (struct sockaddr *)&addr,
offsetof (struct sockaddr_un, sun_path)
+ strlen(addr.sun_path))) {
+ char errbuf[1024];
disabled = 1;
- log_err ("bind() failed: %s", strerror (errno));
+ connector_socket = -1; /* TODO: close? */
+ log_err ("bind() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
pthread_exit ((void *)1);
}
errno = 0;
if (-1 == listen (connector_socket, 5)) {
+ char errbuf[1024];
disabled = 1;
- log_err ("listen() failed: %s", strerror (errno));
+ connector_socket = -1; /* TODO: close? */
+ log_err ("listen() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
pthread_exit ((void *)1);
}
status = getgrnam_r (sock_group, &sg, grbuf, sizeof (grbuf), &grp);
if (status != 0)
{
- log_warn ("getgrnam_r (%s) failed: %s", sock_group, strerror (status));
+ char errbuf[1024];
+ log_warn ("getgrnam_r (%s) failed: %s", sock_group,
+ sstrerror (errno, errbuf, sizeof (errbuf)));
}
else if (grp == NULL)
{
{
status = chown (SOCK_PATH, (uid_t) -1, grp->gr_gid);
if (status != 0)
+ {
+ char errbuf[1024];
log_warn ("chown (%s, -1, %i) failed: %s",
- SOCK_PATH, (int) grp->gr_gid, strerror (errno));
+ SOCK_PATH, (int) grp->gr_gid,
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ }
}
}
else /* geteuid != 0 */
errno = 0;
if (0 != chmod (SOCK_PATH, sock_perms)) {
- log_warn ("chmod() failed: %s", strerror (errno));
+ char errbuf[1024];
+ log_warn ("chmod() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
}
{ /* initialize collector threads */
for (i = 0; i < max_conns; ++i) {
collectors[i] = (collector_t *)smalloc (sizeof (collector_t));
- collectors[i]->socket = 0;
+ collectors[i]->socket = -1;
if (0 != (err = pthread_create (&collectors[i]->thread, &ptattr,
collect, collectors[i]))) {
- log_err ("pthread_create() failed: %s", strerror (err));
+ char errbuf[1024];
+ log_err ("pthread_create() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
+ collectors[i]->thread = (pthread_t) 0;
}
}
errno = 0;
if (-1 == (remote = accept (connector_socket, NULL, NULL))) {
if (EINTR != errno) {
+ char errbuf[1024];
disabled = 1;
- log_err ("accept() failed: %s", strerror (errno));
+ connector_socket = -1; /* TODO: close? */
+ log_err ("accept() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
pthread_exit ((void *)1);
}
}
if (0 != (err = pthread_create (&connector, NULL,
open_connection, NULL))) {
+ char errbuf[1024];
disabled = 1;
- log_err ("pthread_create() failed: %s", strerror (err));
+ log_err ("pthread_create() failed: %s",
+ sstrerror (errno, errbuf, sizeof (errbuf)));
return (-1);
}
{
int i = 0;
- if (disabled)
- return (0);
+ if (connector != ((pthread_t) 0)) {
+ pthread_kill (connector, SIGTERM);
+ connector = (pthread_t) 0;
+ }
- pthread_kill (connector, SIGTERM);
- close (connector_socket);
+ if (connector_socket >= 0) {
+ close (connector_socket);
+ connector_socket = -1;
+ }
/* don't allow any more connections to be processed */
pthread_mutex_lock (&conns_mutex);
- for (i = 0; i < max_conns; ++i) {
- pthread_kill (collectors[i]->thread, SIGTERM);
- close (collectors[i]->socket);
- }
+ if (collectors != NULL) {
+ for (i = 0; i < max_conns; ++i) {
+ if (collectors[i] == NULL)
+ continue;
+
+ if (collectors[i]->thread != ((pthread_t) 0)) {
+ pthread_kill (collectors[i]->thread, SIGTERM);
+ collectors[i]->thread = (pthread_t) 0;
+ }
+
+ if (collectors[i]->socket >= 0) {
+ close (collectors[i]->socket);
+ collectors[i]->socket = -1;
+ }
+ }
+ } /* if (collectors != NULL) */
pthread_mutex_unlock (&conns_mutex);
unlink (SOCK_PATH);
+ errno = 0;
return (0);
} /* static void email_shutdown (void) */
void module_register (void)
{
- plugin_register_data_set (&email_count_ds);
- plugin_register_data_set (&email_size_ds);
- plugin_register_data_set (&spam_check_ds);
- plugin_register_data_set (&spam_score_ds);
-
plugin_register_config ("email", email_config, config_keys, config_keys_num);
plugin_register_init ("email", email_init);
plugin_register_read ("email", email_read);
plugin_register_shutdown ("email", email_shutdown);
-} /* void module_register (void) */
+} /* void module_register */
/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
-