X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Funixsock.c;h=57f34501f8f0dfd423c4c1c8435ea71e9caaf2bc;hb=4681a2490fbb74b37bb6f516c4c96c76b0715f7c;hp=0759802030a2d09b5d5ac13bbebf814557548bbd;hpb=cacaa2126020832df99fa6423147bd3de6d4faae;p=collectd.git diff --git a/src/unixsock.c b/src/unixsock.c index 07598020..57f34501 100644 --- a/src/unixsock.c +++ b/src/unixsock.c @@ -159,15 +159,12 @@ static void *us_handle_client (void *arg) { int fd; FILE *fhin, *fhout; - char buffer[1024]; - char *fields[128]; - int fields_num; fd = *((int *) arg); free (arg); arg = NULL; - DEBUG ("Reading from fd #%i", fd); + DEBUG ("unixsock plugin: us_handle_client: Reading from fd #%i", fd); fhin = fdopen (fd, "r"); if (fhin == NULL) @@ -189,9 +186,37 @@ static void *us_handle_client (void *arg) pthread_exit ((void *) 1); } - while (fgets (buffer, sizeof (buffer), fhin) != NULL) + /* change output buffer to line buffered mode */ + if (setvbuf (fhout, NULL, _IOLBF, 0) != 0) { - int len; + char errbuf[1024]; + ERROR ("unixsock plugin: setvbuf failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + fclose (fhin); + fclose (fhout); + pthread_exit ((void *) 1); + } + + while (42) + { + char buffer[1024]; + char buffer_copy[1024]; + char *fields[128]; + int fields_num; + int len; + + errno = 0; + if (fgets (buffer, sizeof (buffer), fhin) == NULL) + { + if (errno != 0) + { + char errbuf[1024]; + WARNING ("unixsock plugin: failed to read from socket #%i: %s", + fileno (fhin), + sstrerror (errno, errbuf, sizeof (errbuf))); + } + break; + } len = strlen (buffer); while ((len > 0) @@ -201,9 +226,9 @@ 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) @@ -214,32 +239,38 @@ static void *us_handle_client (void *arg) if (strcasecmp (fields[0], "getval") == 0) { - handle_getval (fhout, fields, fields_num); + handle_getval (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 { - fprintf (fhout, "-1 Unknown command: %s\n", fields[0]); - fflush (fhout); + if (fprintf (fhout, "-1 Unknown command: %s\n", fields[0]) < 0) + { + char errbuf[1024]; + WARNING ("unixsock plugin: failed to write to socket #%i: %s", + fileno (fhout), + sstrerror (errno, errbuf, sizeof (errbuf))); + break; + } } } /* while (fgets) */ - DEBUG ("Exiting.."); + DEBUG ("unixsock plugin: us_handle_client: Exiting.."); fclose (fhin); fclose (fhout); @@ -247,7 +278,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; @@ -352,8 +383,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);