Merge branch 'master' of octo@verplant.org:/var/lib/git/collectd
authorFlorian Forster <octo@crystal.wlan.home.verplant.org>
Wed, 6 Dec 2006 08:59:20 +0000 (09:59 +0100)
committerFlorian Forster <octo@crystal.wlan.home.verplant.org>
Wed, 6 Dec 2006 08:59:20 +0000 (09:59 +0100)
1  2 
src/email.c

diff --combined src/email.c
  #     include <sys/un.h>
  #endif /* HAVE_LINUX_UN_H | HAVE_SYS_UN_H */
  
 +/* some systems (e.g. Darwin) seem to not define UNIX_PATH_MAX at all */
 +#ifndef UNIX_PATH_MAX
 +# define UNIX_PATH_MAX sizeof (((struct sockaddr_un *)0)->sun_path)
 +#endif /* UNIX_PATH_MAX */
 +
  #if HAVE_GRP_H
  #     include <grp.h>
  #endif /* HAVE_GRP_H */
@@@ -144,6 -139,7 +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 -529,11 +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);
        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));
@@@ -713,6 -707,31 +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 -865,7 +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;