diff --git a/src/client/sock.c b/src/client/sock.c
index 8602532da9eea9d4575d85d52fdc82cc34976c91..336d0620539531e0428525ad3607a52b1315405e 100644 (file)
--- a/src/client/sock.c
+++ b/src/client/sock.c
#include "utils/error.h"
#include "utils/strbuf.h"
#include "utils/proto.h"
+#include "utils/os.h"
#include <arpa/inet.h>
+#include <assert.h>
#include <errno.h>
#include <limits.h>
struct sdb_client {
char *address;
int fd;
- _Bool eof;
+ bool eof;
+
+ ssize_t (*read)(sdb_client_t *, sdb_strbuf_t *, size_t);
+ ssize_t (*write)(sdb_client_t *, const void *, size_t);
};
/*
* private helper functions
*/
+static ssize_t
+client_read(sdb_client_t *client, sdb_strbuf_t *buf, size_t n)
+{
+ return sdb_strbuf_read(buf, client->fd, n);
+} /* client_read */
+
+static ssize_t
+client_write(sdb_client_t *client, const void *buf, size_t n)
+{
+ return sdb_write(client->fd, n, buf);
+} /* client_write */
+
static int
connect_unixsock(sdb_client_t *client, const char *address)
{
client->fd = -1;
client->eof = 1;
+ client->read = client_read;
+ client->write = client_write;
+
client->address = strdup(address);
if (! client->address) {
sdb_client_destroy(client);
"for server response");
if (rstatus == SDB_CONNECTION_ERROR) {
- sdb_log(SDB_LOG_ERR, "Access denied for user '%s'", username);
+ sdb_log(SDB_LOG_ERR, "Access denied for user '%s': %s",
+ username, sdb_strbuf_string(buf));
status = -((int)rstatus);
}
else if (rstatus != SDB_CONNECTION_OK) {
sdb_client_send(sdb_client_t *client,
uint32_t cmd, uint32_t msg_len, const char *msg)
{
+ char buf[2 * sizeof(uint32_t) + msg_len];
+
if ((! client) || (! client->fd))
return -1;
+ if (sdb_proto_marshal(buf, sizeof(buf), cmd, msg_len, msg) < 0)
+ return -1;
- return sdb_proto_send_msg(client->fd, cmd, msg_len, msg);
+ return client->write(client, buf, sizeof(buf));
} /* sdb_client_send */
ssize_t
while (42) {
ssize_t status;
- if (sdb_proto_select(client->fd, SDB_PROTO_SELECTIN))
+ if (sdb_select(client->fd, SDB_SELECTIN))
return -1;
errno = 0;
- status = sdb_strbuf_read(buf, client->fd, req);
+ status = client->read(client, buf, req);
if (status < 0) {
if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
continue;
continue;
if (rstatus == UINT32_MAX) {
+ const char *str = sdb_strbuf_string(buf) + data_offset;
+ size_t len = sdb_strbuf_len(buf) - data_offset;
+ ssize_t n;
+
/* retrieve status and data len */
- rstatus = sdb_proto_get_int(buf, data_offset);
- rlen = sdb_proto_get_int(buf, data_offset + sizeof(rstatus));
+ assert(len >= 2 * sizeof(uint32_t));
+ n = sdb_proto_unmarshal_int32(str, len, &rstatus);
+ str += n; len -= (size_t)n;
+ sdb_proto_unmarshal_int32(str, len, &rlen);
if (! rlen)
break;
return (ssize_t)total;
} /* sdb_client_recv */
-_Bool
+bool
sdb_client_eof(sdb_client_t *client)
{
if ((! client) || (client->fd < 0))