From: Sebastian Harl Date: Wed, 26 Mar 2008 08:42:56 +0000 (+0100) Subject: unixsock plugin: Open two different IO stream handles for reading and writing. X-Git-Tag: collectd-4.3.2~4 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=ac03ae49d85c01fe2da58dd78f66db58416d81cc;p=collectd.git unixsock plugin: Open two different IO stream handles for reading and writing. Full-duplex standard IO streams are not really supported on sockets. Mixing input and output functions involves calls to lseek(2) which is not supported on sockets and thus causes the IO operations to fail. Opening two IO streams solves the problem. This is a backport of 43df21461d523023951746ef669f1bb95f61366d. Signed-off-by: Sebastian Harl Signed-off-by: Florian Forster --- diff --git a/src/unixsock.c b/src/unixsock.c index 837a9021..9fa02596 100644 --- a/src/unixsock.c +++ b/src/unixsock.c @@ -547,7 +547,7 @@ static int us_handle_listval (FILE *fh, char **fields, int fields_num) static void *us_handle_client (void *arg) { int fd; - FILE *fh; + FILE *fhin, *fhout; char buffer[1024]; char *fields[128]; int fields_num; @@ -558,8 +558,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", @@ -568,7 +568,17 @@ 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) + { + 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); + } + + while (fgets (buffer, sizeof (buffer), fhin) != NULL) { int len; @@ -593,29 +603,30 @@ static void *us_handle_client (void *arg) if (strcasecmp (fields[0], "getval") == 0) { - us_handle_getval (fh, fields, fields_num); + us_handle_getval (fhout, fields, fields_num); } else if (strcasecmp (fields[0], "putval") == 0) { - handle_putval (fh, fields, fields_num); + handle_putval (fhout, fields, fields_num); } else if (strcasecmp (fields[0], "listval") == 0) { - us_handle_listval (fh, fields, fields_num); + us_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 { - fprintf (fh, "-1 Unknown command: %s\n", fields[0]); - fflush (fh); + fprintf (fhout, "-1 Unknown command: %s\n", fields[0]); + fflush (fhout); } } /* while (fgets) */ DEBUG ("Exiting.."); - close (fd); + fclose (fhin); + fclose (fhout); pthread_exit ((void *) 0); return ((void *) 0);