X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Funixsock.c;h=d729477bbc54db999322dedfe581834dc9725c21;hb=6e0ffb3d9edba6a4b819ace076aea0e9b5fcea51;hp=be36abc8c8f9bbb339c6557b701e41f4c62a61cd;hpb=e21d0408e4e4001b8c66bb1ea7d41b890100d0f5;p=collectd.git diff --git a/src/unixsock.c b/src/unixsock.c index be36abc8..d729477b 100644 --- a/src/unixsock.c +++ b/src/unixsock.c @@ -26,7 +26,6 @@ #include "utils_cmd_flush.h" #include "utils_cmd_getval.h" -#include "utils_cmd_getthreshold.h" #include "utils_cmd_listval.h" #include "utils_cmd_putval.h" #include "utils_cmd_putnotif.h" @@ -54,7 +53,8 @@ static const char *config_keys[] = { "SocketFile", "SocketGroup", - "SocketPerms" + "SocketPerms", + "DeleteSocket" }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); @@ -65,6 +65,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 +90,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) { @@ -158,32 +176,45 @@ static int us_open_socket (void) static void *us_handle_client (void *arg) { - int fd; + int fdin; + int fdout; FILE *fhin, *fhout; - fd = *((int *) arg); + fdin = *((int *) arg); free (arg); arg = NULL; - DEBUG ("unixsock plugin: us_handle_client: Reading from fd #%i", fd); + DEBUG ("unixsock plugin: us_handle_client: Reading from fd #%i", fdin); + + fdout = dup (fdin); + if (fdout < 0) + { + char errbuf[1024]; + ERROR ("unixsock plugin: dup failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + close (fdin); + pthread_exit ((void *) 1); + } - fhin = fdopen (fd, "r"); + fhin = fdopen (fdin, "r"); if (fhin == NULL) { char errbuf[1024]; ERROR ("unixsock plugin: fdopen failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); - close (fd); + close (fdin); + close (fdout); pthread_exit ((void *) 1); } - fhout = fdopen (fd, "w"); + fhout = fdopen (fdout, "w"); if (fhout == NULL) { char errbuf[1024]; ERROR ("unixsock plugin: fdopen failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); - fclose (fhin); /* this closes fd as well */ + fclose (fhin); /* this closes fdin as well */ + close (fdout); pthread_exit ((void *) 1); } @@ -231,21 +262,18 @@ static void *us_handle_client (void *arg) fields_num = strsplit (buffer_copy, fields, sizeof (fields) / sizeof (fields[0])); - if (fields_num < 1) { - close (fd); - break; + fprintf (fhout, "-1 Internal error\n"); + fclose (fhin); + fclose (fhout); + pthread_exit ((void *) 1); } if (strcasecmp (fields[0], "getval") == 0) { handle_getval (fhout, buffer); } - else if (strcasecmp (fields[0], "getthreshold") == 0) - { - handle_getthreshold (fhout, buffer); - } else if (strcasecmp (fields[0], "putval") == 0) { handle_putval (fhout, buffer); @@ -378,6 +406,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);