X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Funixsock.c;h=6a8628a55eaf8fa3dbae2c152c1e1ac461053668;hb=a94f533;hp=8701cb9d43abb9d1db959cf2ddcfe565b70da7f3;hpb=78e83f7d68d154e8d6cdb876162abc90993aed79;p=collectd.git diff --git a/src/unixsock.c b/src/unixsock.c index 8701cb9d..6a8628a5 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); @@ -158,10 +158,7 @@ static int us_open_socket (void) static void *us_handle_client (void *arg) { int fd; - FILE *fh; - char buffer[1024]; - char *fields[128]; - int fields_num; + FILE *fhin, *fhout; fd = *((int *) arg); free (arg); @@ -169,8 +166,8 @@ static void *us_handle_client (void *arg) DEBUG ("Reading from fd #%i", fd); - fh = fdopen (fd, "r+"); - if (fh == NULL) + fhin = fdopen (fd, "r"); + if (fhin == NULL) { char errbuf[1024]; ERROR ("unixsock plugin: fdopen failed: %s", @@ -179,9 +176,47 @@ static void *us_handle_client (void *arg) pthread_exit ((void *) 1); } - while (fgets (buffer, sizeof (buffer), fh) != NULL) + fhout = fdopen (fd, "w"); + if (fhout == NULL) { - int len; + char errbuf[1024]; + ERROR ("unixsock plugin: fdopen failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + fclose (fhin); /* this closes fd as well */ + pthread_exit ((void *) 1); + } + + /* 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) + { + 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) @@ -191,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) @@ -204,33 +239,40 @@ static void *us_handle_client (void *arg) if (strcasecmp (fields[0], "getval") == 0) { - handle_getval (fh, fields, fields_num); + handle_getval (fhout, buffer); } else if (strcasecmp (fields[0], "putval") == 0) { - handle_putval (fh, fields, fields_num); + handle_putval (fhout, buffer); } else if (strcasecmp (fields[0], "listval") == 0) { - handle_listval (fh, fields, fields_num); + handle_listval (fhout, fields, fields_num); } else if (strcasecmp (fields[0], "putnotif") == 0) { - handle_putnotif (fh, fields, fields_num); + handle_putnotif (fhout, fields, fields_num); } else if (strcasecmp (fields[0], "flush") == 0) { - handle_flush (fh, fields, fields_num); + handle_flush (fhout, buffer); } else { - fprintf (fh, "-1 Unknown command: %s\n", fields[0]); - fflush (fh); + 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.."); - close (fd); + fclose (fhin); + fclose (fhout); pthread_exit ((void *) 0); return ((void *) 0); @@ -371,7 +413,6 @@ static int us_shutdown (void) } plugin_unregister_init ("unixsock"); - plugin_unregister_write ("unixsock"); plugin_unregister_shutdown ("unixsock"); return (0);