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>
static void *us_handle_client (void *arg)
{
int fd;
static void *us_handle_client (void *arg)
{
int fd;
char buffer[1024];
char *fields[128];
int fields_num;
char buffer[1024];
char *fields[128];
int fields_num;
DEBUG ("Reading from fd #%i", fd);
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",
{
char errbuf[1024];
ERROR ("unixsock plugin: fdopen failed: %s",
pthread_exit ((void *) 1);
}
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)
if (strcasecmp (fields[0], "getval") == 0)
{
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)
{
}
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)
{
}
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)
{
}
else if (strcasecmp (fields[0], "putnotif") == 0)
{
- handle_putnotif (fh, fields, fields_num);
+ handle_putnotif (fhout, fields, fields_num);
- 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..");
}
} /* while (fgets) */
DEBUG ("Exiting..");
+ fclose (fhin);
+ fclose (fhout);
pthread_exit ((void *) 0);
return ((void *) 0);
pthread_exit ((void *) 0);
return ((void *) 0);