diff --git a/src/utils/unixsock.c b/src/utils/unixsock.c
index 138205d936bfc6573d08b99c77246f7c93e103ea..1a4373abb4ee92bc38b0cb23982f36d93b61f490 100644 (file)
--- a/src/utils/unixsock.c
+++ b/src/utils/unixsock.c
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "utils/error.h"
#include "utils/unixsock.h"
-#include "core/error.h"
#include <assert.h>
#include <errno.h>
case SDB_TYPE_BINARY:
/* we don't support any binary information containing 0-bytes */
data->data.binary.length = strlen(string);
- data->data.binary.datum = (const unsigned char *)string;
+ data->data.binary.datum = (unsigned char *)string;
break;
default:
sdb_log(SDB_LOG_ERR, "unixsock: Unexpected type %i while "
return -1;
}
+ /* enable line-buffering */
+ setvbuf(client->fh, NULL, _IOLBF, 0);
+
client->shutdown = 0;
return 0;
} /* sdb_unixsock_client_connect */
sdb_unixsock_client_recv(sdb_unixsock_client_t *client,
char *buffer, size_t buflen)
{
+ char *tmp;
+
if ((! client) || (! client->fh) || (! buffer))
return NULL;
if (client->shutdown & SDB_SHUT_RD) /* reconnect */
sdb_unixsock_client_connect(client);
- buffer = fgets(buffer, (int)buflen - 1, client->fh);
- if (! buffer) {
- if (! feof(client->fh)) {
- char errbuf[1024];
- sdb_log(SDB_LOG_ERR, "unixsock: Failed to read "
- "from socket (%s): %s", client->path,
- sdb_strerror(errno, errbuf, sizeof(errbuf)));
+ tmp = NULL;
+ while (tmp == NULL) {
+ errno = 0;
+ tmp = fgets(buffer, (int)buflen - 1, client->fh);
+ if (! tmp) {
+ if ((errno == EAGAIN) || (errno == EINTR))
+ continue;
+
+ if (! feof(client->fh)) {
+ char errbuf[1024];
+ sdb_log(SDB_LOG_ERR, "unixsock: Failed to read "
+ "from socket (%s): %s", client->path,
+ sdb_strerror(errno, errbuf, sizeof(errbuf)));
+ }
+ return NULL;
}
- return buffer;
}
buffer[buflen - 1] = '\0';
buflen = strlen(buffer);
- while ((buffer[buflen - 1] == '\n') || (buffer[buflen - 1] == '\r')) {
+ while (buflen && ((buffer[buflen - 1] == '\n') || (buffer[buflen - 1] == '\r'))) {
buffer[buflen - 1] = '\0';
--buflen;
}