X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Funixsock.c;h=0b897482c9d956547d74be3f905f9d9941b157be;hb=6c134837a38a566a6ad78225ef5e5c3cc9b7d832;hp=d80091b1bd18bfffd290ae4c7a54b6086131605f;hpb=6acb19befc321c501e4d8b79f403ebda0c021acc;p=collectd.git diff --git a/src/unixsock.c b/src/unixsock.c index d80091b1..0b897482 100644 --- a/src/unixsock.c +++ b/src/unixsock.c @@ -26,6 +26,7 @@ #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" @@ -86,8 +87,8 @@ static int us_open_socket (void) memset (&sa, '\0', sizeof (sa)); sa.sun_family = AF_UNIX; - strncpy (sa.sun_path, (sock_file != NULL) ? sock_file : US_DEFAULT_PATH, - sizeof (sa.sun_path) - 1); + 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); @@ -157,35 +158,45 @@ static int us_open_socket (void) static void *us_handle_client (void *arg) { - int fd; + int fdin; + int fdout; FILE *fhin, *fhout; - char buffer[1024]; - char *fields[128]; - int fields_num; - fd = *((int *) arg); + fdin = *((int *) arg); free (arg); arg = NULL; - DEBUG ("Reading from fd #%i", fd); + DEBUG ("unixsock plugin: us_handle_client: Reading from fd #%i", fdin); - fhin = fdopen (fd, "r"); + 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 (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); } @@ -202,7 +213,11 @@ static void *us_handle_client (void *arg) while (42) { - int len; + char buffer[1024]; + char buffer_copy[1024]; + char *fields[128]; + int fields_num; + int len; errno = 0; if (fgets (buffer, sizeof (buffer), fhin) == NULL) @@ -225,36 +240,41 @@ static void *us_handle_client (void *arg) if (len == 0) continue; - DEBUG ("fgets -> buffer = %s; len = %i;", buffer, len); + sstrncpy (buffer_copy, buffer, sizeof (buffer_copy)); - fields_num = strsplit (buffer, fields, + 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, fields, fields_num); + 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, fields, fields_num); + handle_putval (fhout, buffer); } else if (strcasecmp (fields[0], "listval") == 0) { - handle_listval (fhout, fields, fields_num); + handle_listval (fhout, buffer); } else if (strcasecmp (fields[0], "putnotif") == 0) { - handle_putnotif (fhout, fields, fields_num); + handle_putnotif (fhout, buffer); } else if (strcasecmp (fields[0], "flush") == 0) { - handle_flush (fhout, fields, fields_num); + handle_flush (fhout, buffer); } else { @@ -269,7 +289,7 @@ static void *us_handle_client (void *arg) } } /* while (fgets) */ - DEBUG ("Exiting.."); + DEBUG ("unixsock plugin: us_handle_client: Exiting.."); fclose (fhin); fclose (fhout); @@ -277,7 +297,7 @@ static void *us_handle_client (void *arg) return ((void *) 0); } /* void *us_handle_client */ -static void *us_server_thread (void *arg) +static void *us_server_thread (void __attribute__((unused)) *arg) { int status; int *remote_fd; @@ -382,8 +402,15 @@ static int us_config (const char *key, const char *val) static int us_init (void) { + static int have_init = 0; + int status; + /* Initialize only once. */ + if (have_init != 0) + return (0); + have_init = 1; + loop = 1; status = pthread_create (&listen_thread, NULL, us_server_thread, NULL);