email plugin: Change owner and mode of the UNIX socket if possible.
authorSebastian Harl <sh@tokkee.org>
Thu, 30 Nov 2006 11:02:10 +0000 (12:02 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 2 Dec 2006 17:02:43 +0000 (18:02 +0100)
Set the owner and mode to COLLECTD_GRP_NAME (defaulting to "collectd") and 0770
respectively. A couple of different daemons running as different users might
want to connect to it.

Signed-off-by: Sebastian Harl <sh@tokkee.org>
configure.in
src/collectd.h
src/email.c

index ca10e21..823845a 100644 (file)
@@ -277,6 +277,7 @@ AC_CHECK_HEADERS(linux/un.h, [], [],
 #endif
 ])
 AC_CHECK_HEADERS(sys/un.h)
+AC_CHECK_HEADERS(grp.h)
 
 # For debugging interface (variable number of arguments)
 AC_CHECK_HEADERS(stdarg.h)
index 4d75db4..d8f74f9 100644 (file)
 #define MODE_LOCAL  0x04
 #define MODE_LOG    0x08
 
+#ifndef COLLECTD_GRP_NAME
+#      define COLLECTD_GRP_NAME "collectd"
+#endif
+
 #ifndef COLLECTD_STEP
 #  define COLLECTD_STEP "10"
 #endif
index 5f612cd..27370ae 100644 (file)
 #      include <sys/un.h>
 #endif /* HAVE_LINUX_UN_H | HAVE_SYS_UN_H */
 
+#if HAVE_GRP_H
+#      include <grp.h>
+#endif /* HAVE_GRP_H */
+
 #define MODULE_NAME "email"
 
 /* 256 bytes ought to be enough for anybody ;-) */
@@ -484,6 +488,29 @@ static void *open_connection (void *arg)
                pthread_exit ((void *)1);
        }
 
+       if ((uid_t)0 == geteuid ()) {
+               struct group *grp;
+
+               errno = 0;
+               if (NULL != (grp = getgrnam (COLLECTD_GRP_NAME))) {
+                       errno = 0;
+                       if (0 != chown (SOCK_PATH, (uid_t)-1, grp->gr_gid)) {
+                               syslog (LOG_WARNING, "chown() failed: %s", strerror (errno));
+                       }
+               }
+               else {
+                       syslog (LOG_WARNING, "getgrnam() failed: %s", strerror (errno));
+               }
+       }
+       else {
+               syslog (LOG_WARNING, "not running as root");
+       }
+
+       errno = 0;
+       if (0 != chmod (SOCK_PATH, S_IRWXU | S_IRWXG)) {
+               syslog (LOG_WARNING, "chmod() failed: %s", strerror (errno));
+       }
+
        { /* initialize queue of available threads */
                int i = 0;