Code

proto: Let unmarshal functions return the number of bytes processed.
[sysdb.git] / src / client / sock.c
index 533e9e31b62c16457f36ae1e844a450251c26c51..0d734f3a9462ba74bb7405beb94c9fdeecb67d8a 100644 (file)
 #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>
 
@@ -248,10 +250,14 @@ ssize_t
 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 sdb_write(client->fd, sizeof(buf), buf);
 } /* sdb_client_send */
 
 ssize_t
@@ -277,7 +283,7 @@ sdb_client_recv(sdb_client_t *client,
        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;
@@ -298,9 +304,15 @@ sdb_client_recv(sdb_client_t *client,
                        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;