X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Funixsock.c;h=d34b91fae204d9ac43e885c5895db4c37448005e;hb=ec9abb566017d406745f5f263b55792f89cede1a;hp=025c91d5a6be76f6a2a94812af2f018782b17d43;hpb=af46a5f31a0e8d4279d63d8ca9232dbd433dfb25;p=collectd.git diff --git a/src/unixsock.c b/src/unixsock.c index 025c91d5..d34b91fa 100644 --- a/src/unixsock.c +++ b/src/unixsock.c @@ -86,8 +86,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); @@ -189,10 +189,34 @@ 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) + { + char errbuf[1024]; + ERROR ("unixsock plugin: setvbuf failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + fclose (fhin); + fclose (fhout); + pthread_exit ((void *) 1); + } + + while (42) { 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) && ((buffer[len - 1] == '\n') || (buffer[len - 1] == '\r'))) @@ -234,8 +258,14 @@ static void *us_handle_client (void *arg) } 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) */