[collectd] [PATCH] unixsock plugin: Open two different IO stream	handles for reading and writing.
    Sebastian Harl 
    sh at tokkee.org
       
    Tue Mar 25 19:58:20 CET 2008
    
    
  
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.
Signed-off-by: Sebastian Harl <sh at tokkee.org>
---
 src/unixsock.c |   35 +++++++++++++++++++++++------------
 1 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/src/unixsock.c b/src/unixsock.c
index 8701cb9..80198ce 100644
--- a/src/unixsock.c
+++ b/src/unixsock.c
@@ -158,7 +158,7 @@ static int us_open_socket (void)
 static void *us_handle_client (void *arg)
 {
 	int fd;
-	FILE *fh;
+	FILE *fhin, *fhout;
 	char buffer[1024];
 	char *fields[128];
 	int   fields_num;
@@ -169,8 +169,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,7 +179,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;
 
@@ -204,33 +214,34 @@ static void *us_handle_client (void *arg)
 
 		if (strcasecmp (fields[0], "getval") == 0)
 		{
-			handle_getval (fh, fields, fields_num);
+			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)
 		{
-			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, 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);
-- 
1.5.5.rc1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mailman.verplant.org/pipermail/collectd/attachments/20080325/08119430/attachment.pgp 
    
    
More information about the collectd
mailing list