X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Femail.c;h=9fd05ba0fcf15ad4aa9a6de2d8a8cd0319aa1d20;hb=c8143a8ae616b003001a57c68f3a9b193c390dc8;hp=404a20a8951f6619b9a481f7051f9d4f10859918;hpb=33d409e0d68beac9d6d5439a9237b50f28fcd976;p=collectd.git diff --git a/src/email.c b/src/email.c index 404a20a8..9fd05ba0 100644 --- a/src/email.c +++ b/src/email.c @@ -144,6 +144,7 @@ static int disabled = 0; /* thread managing "client" connections */ static pthread_t connector; +static int connector_socket; /* tell the connector thread that a collector is available */ static pthread_cond_t collector_available = PTHREAD_COND_INITIALIZER; @@ -533,13 +534,11 @@ static void *collect (void *arg) static void *open_connection (void *arg) { - int local = 0; - struct sockaddr_un addr; /* create UNIX socket */ errno = 0; - if (-1 == (local = socket (PF_UNIX, SOCK_STREAM, 0))) { + if (-1 == (connector_socket = socket (PF_UNIX, SOCK_STREAM, 0))) { disabled = 1; syslog (LOG_ERR, "socket() failed: %s", strerror (errno)); pthread_exit ((void *)1); @@ -552,7 +551,7 @@ static void *open_connection (void *arg) unlink (addr.sun_path); errno = 0; - if (-1 == bind (local, (struct sockaddr *)&addr, + if (-1 == bind (connector_socket, (struct sockaddr *)&addr, offsetof (struct sockaddr_un, sun_path) + strlen(addr.sun_path))) { disabled = 1; @@ -561,7 +560,7 @@ static void *open_connection (void *arg) } errno = 0; - if (-1 == listen (local, 5)) { + if (-1 == listen (connector_socket, 5)) { disabled = 1; syslog (LOG_ERR, "listen() failed: %s", strerror (errno)); pthread_exit ((void *)1); @@ -628,7 +627,7 @@ static void *open_connection (void *arg) do { errno = 0; - if (-1 == (remote = accept (local, NULL, NULL))) { + if (-1 == (remote = accept (connector_socket, NULL, NULL))) { if (EINTR != errno) { disabled = 1; syslog (LOG_ERR, "accept() failed: %s", strerror (errno)); @@ -713,6 +712,31 @@ static void email_init (void) return; } /* static void email_init (void) */ +#if EMAIL_HAVE_READ +static void email_shutdown (void) +{ + collector_t *ptr; + + if (disabled) + return; + + close (connector_socket); + pthread_kill (connector, SIGTERM); + + pthread_mutex_lock (&active_mutex); + + for (ptr = active.head; NULL != ptr; ptr = ptr->next) { + close (ptr->socket); + pthread_kill (ptr->thread, SIGTERM); + } + + pthread_mutex_unlock (&active_mutex); + + unlink (SOCK_PATH); + return; +} /* static void email_shutdown (void) */ +#endif /* EMAIL_HAVE_READ */ + static void count_write (char *host, char *inst, char *val) { char file[BUFSIZE] = ""; @@ -846,6 +870,7 @@ void module_register (void) plugin_register ("email_spam_score", NULL, NULL, score_write); plugin_register ("email_spam_check", NULL, NULL, check_write); #if EMAIL_HAVE_READ + plugin_register_shutdown (MODULE_NAME, email_shutdown); cf_register (MODULE_NAME, email_config, config_keys, config_keys_num); #endif /* EMAIL_HAVE_READ */ return;