Code

Merge branch 'ff/processes'
[collectd.git] / src / email.c
index 8d2c89143177b90097992d1921014ec155fb9797..b7995973dae20556392908d52298bafd79c70d88 100644 (file)
@@ -38,6 +38,8 @@
 #include "common.h"
 #include "plugin.h"
 
+#include "configfile.h"
+
 #if HAVE_LIBPTHREAD
 # include <pthread.h>
 # define EMAIL_HAVE_READ 1
@@ -71,6 +73,7 @@
 
 #define SOCK_PATH "/tmp/.collectd-email"
 #define MAX_CONNS 5
+#define MAX_CONNS_LIMIT 16384
 
 /*
  * Private data structures
@@ -112,6 +115,21 @@ typedef struct {
  * Private variables
  */
 #if EMAIL_HAVE_READ
+/* valid configuration file keys */
+static char *config_keys[] =
+{
+       "SocketGroup",
+       "SocketPerms",
+       "MaxConns",
+       NULL
+};
+static int config_keys_num = 3;
+
+/* socket configuration */
+static char *sock_group = COLLECTD_GRP_NAME;
+static int  sock_perms  = S_IRWXU | S_IRWXG;
+static int  max_conns   = MAX_CONNS;
+
 /* state of the plugin */
 static int disabled = 0;
 
@@ -176,6 +194,40 @@ static char *check_ds_def[] =
 static int check_ds_num = 1;
 
 #if EMAIL_HAVE_READ
+static int email_config (char *key, char *value)
+{
+       if (0 == strcasecmp (key, "SocketGroup")) {
+               sock_group = sstrdup (value);
+       }
+       else if (0 == strcasecmp (key, "SocketPerms")) {
+               /* the user is responsible for providing reasonable values */
+               sock_perms = (int)strtol (value, NULL, 0);
+       }
+       else if (0 == strcasecmp (key, "MaxConns")) {
+               long int tmp = strtol (value, NULL, 0);
+
+               if (tmp < 1) {
+                       fprintf (stderr, "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_LIMIT;
+               }
+               else {
+                       max_conns = (int)tmp;
+               }
+       }
+       else {
+               return -1;
+       }
+       return 0;
+} /* static int email_config (char *, char *) */
+
 /* Increment the value of the given name in the given list by incr. */
 static void type_list_incr (type_list_t *list, char *name, int incr)
 {
@@ -510,7 +562,7 @@ static void *open_connection (void *arg)
                struct group *grp;
 
                errno = 0;
-               if (NULL != (grp = getgrnam (COLLECTD_GRP_NAME))) {
+               if (NULL != (grp = getgrnam (sock_group))) {
                        errno = 0;
                        if (0 != chown (SOCK_PATH, (uid_t)-1, grp->gr_gid)) {
                                syslog (LOG_WARNING, "chown() failed: %s", strerror (errno));
@@ -525,7 +577,7 @@ static void *open_connection (void *arg)
        }
 
        errno = 0;
-       if (0 != chmod (SOCK_PATH, S_IRWXU | S_IRWXG)) {
+       if (0 != chmod (SOCK_PATH, sock_perms)) {
                syslog (LOG_WARNING, "chmod() failed: %s", strerror (errno));
        }
 
@@ -543,7 +595,7 @@ static void *open_connection (void *arg)
 
                last = available.head;
 
-               for (i = 1; i < MAX_CONNS; ++i) {
+               for (i = 1; i < max_conns; ++i) {
                        last->next = (collector_t *)smalloc (sizeof (collector_t));
                        last = last->next;
                        available.tail = last;
@@ -784,6 +836,9 @@ void module_register (void)
        plugin_register ("email_size", NULL, NULL, size_write);
        plugin_register ("email_spam_score", NULL, NULL, score_write);
        plugin_register ("email_spam_check", NULL, NULL, check_write);
+#if EMAIL_HAVE_READ
+       cf_register (MODULE_NAME, email_config, config_keys, config_keys_num);
+#endif /* EMAIL_HAVE_READ */
        return;
 } /* void module_register (void) */