From 053bea810096f410d3b03ade7ef761da05565a45 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Thu, 11 Nov 2010 16:56:32 +0100 Subject: [PATCH] unixsock plugin: Implement the "DeleteSocket" option. --- src/collectd.conf.in | 1 + src/collectd.conf.pod | 7 +++++++ src/unixsock.c | 30 ++++++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/collectd.conf.in b/src/collectd.conf.in index 42addd27..e194d142 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -913,6 +913,7 @@ # SocketFile "@prefix@/var/run/@PACKAGE_NAME@-unixsock" # SocketGroup "collectd" # SocketPerms "0660" +# DeleteSocket false # # diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index 1da35982..1c31d97f 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -4558,6 +4558,13 @@ Change the file permissions of the UNIX-socket after it has been created. The permissions must be given as a numeric, octal value as you would pass to L. Defaults to B<0770>. +=item B B|B + +If set to B, delete the socket file before calling L, if a file +with the given name already exists. If I crashes a socket file may be +left over, preventing the daemon from opening a new socket when restarted. +Since this is potentially dangerous, this defaults to B. + =back =head2 Plugin C diff --git a/src/unixsock.c b/src/unixsock.c index 0b897482..6de13956 100644 --- a/src/unixsock.c +++ b/src/unixsock.c @@ -54,7 +54,8 @@ static const char *config_keys[] = { "SocketFile", "SocketGroup", - "SocketPerms" + "SocketPerms", + "DeleteSocket" }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); @@ -65,6 +66,7 @@ static int sock_fd = -1; static char *sock_file = NULL; static char *sock_group = NULL; static int sock_perms = S_IRWXU | S_IRWXG; +static _Bool delete_socket = 0; static pthread_t listen_thread = (pthread_t) 0; @@ -89,10 +91,27 @@ static int us_open_socket (void) sa.sun_family = AF_UNIX; sstrncpy (sa.sun_path, (sock_file != NULL) ? sock_file : US_DEFAULT_PATH, sizeof (sa.sun_path)); - /* unlink (sa.sun_path); */ DEBUG ("unixsock plugin: socket path = %s", sa.sun_path); + if (delete_socket) + { + errno = 0; + status = unlink (sa.sun_path); + if ((status != 0) && (errno != ENOENT)) + { + char errbuf[1024]; + WARNING ("unixsock plugin: Deleting socket file \"%s\" failed: %s", + sa.sun_path, + sstrerror (errno, errbuf, sizeof (errbuf))); + } + else if (status == 0) + { + INFO ("unixsock plugin: Successfully deleted socket file \"%s\".", + sa.sun_path); + } + } + status = bind (sock_fd, (struct sockaddr *) &sa, sizeof (sa)); if (status != 0) { @@ -392,6 +411,13 @@ static int us_config (const char *key, const char *val) { sock_perms = (int) strtol (val, NULL, 8); } + else if (strcasecmp (key, "DeleteSocket") == 0) + { + if (IS_TRUE (val)) + delete_socket = 1; + else + delete_socket = 0; + } else { return (-1); -- 2.30.2