summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 271529f)
raw | patch | inline | side by side (parent: 271529f)
author | Sebastian Harl <sh@tokkee.org> | |
Wed, 26 Mar 2008 08:44:04 +0000 (09:44 +0100) | ||
committer | Florian Forster <octo@huhu.verplant.org> | |
Wed, 26 Mar 2008 08:44:04 +0000 (09:44 +0100) |
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 <sh@tokkee.org>
Signed-off-by: Florian Forster <octo@huhu.verplant.org>
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 <sh@tokkee.org>
Signed-off-by: Florian Forster <octo@huhu.verplant.org>
src/unixsock.c | patch | blob | history |
diff --git a/src/unixsock.c b/src/unixsock.c
index c7e0c4472f40e3ff7166ce8f802b77962eccd21b..f8dcc5ba6b5e6c864572101a861cf465ecb8f211 100644 (file)
--- a/src/unixsock.c
+++ b/src/unixsock.c
static void *us_handle_client (void *arg)
{
int fd;
- FILE *fh;
+ FILE *fhin, *fhout;
char buffer[1024];
char *fields[128];
int fields_num;
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",
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;
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
{
- 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);
} /* void *us_handle_client */