summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9769c37)
raw | patch | inline | side by side (parent: 9769c37)
author | Sebastian Harl <sh@tokkee.org> | |
Mon, 4 Dec 2006 12:53:16 +0000 (13:53 +0100) | ||
committer | Florian Forster <octo@leeloo.lan.home.verplant.org> | |
Tue, 5 Dec 2006 17:00:35 +0000 (18:00 +0100) |
Using a shutdown function the email plugin closes any sockets, terminates all
running threads and removes the UNIX socket.
Signed-off-by: Sebastian Harl <sh@tokkee.org>
running threads and removes the UNIX socket.
Signed-off-by: Sebastian Harl <sh@tokkee.org>
src/email.c | patch | blob | history |
diff --git a/src/email.c b/src/email.c
index b7995973dae20556392908d52298bafd79c70d88..80cb4bd6b22f49134fec440dba889e734019cb71 100644 (file)
--- a/src/email.c
+++ b/src/email.c
/* 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;
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);
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;
}
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);
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));
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] = "";
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;