diff --git a/src/utils/proto.c b/src/utils/proto.c
index 3315e0c7878056393df7a581b558f4a70df8e417..dc6ee715e721ea3ea5f8e60ffec85c8de484acbb 100644 (file)
--- a/src/utils/proto.c
+++ b/src/utils/proto.c
* public API
*/
-int
-sdb_proto_select(int fd, int type)
-{
- fd_set fds;
- fd_set *readfds = NULL;
- fd_set *writefds = NULL;
- fd_set *exceptfds = NULL;
-
- if (fd < 0) {
- errno = EBADF;
- return -1;
- }
-
- FD_ZERO(&fds);
-
- switch (type) {
- case SDB_PROTO_SELECTIN:
- readfds = &fds;
- break;
- case SDB_PROTO_SELECTOUT:
- writefds = &fds;
- break;
- case SDB_PROTO_SELECTERR:
- exceptfds = &fds;
- break;
- default:
- errno = EINVAL;
- return -1;
- }
-
- FD_SET(fd, &fds);
-
- while (42) {
- int n;
- errno = 0;
- n = select(fd + 1, readfds, writefds, exceptfds, NULL);
-
- if ((n < 0) && (errno != EINTR))
- return n;
- if (n > 0)
- break;
- }
- return 0;
-} /* sdb_proto_select */
-
-ssize_t
-sdb_proto_send(int fd, size_t msg_len, const char *msg)
-{
- const char *buf;
- size_t len;
-
- if ((fd < 0) || (msg_len && (! msg)))
- return -1;
- if (! msg_len)
- return 0;
-
- buf = msg;
- len = msg_len;
- while (len > 0) {
- ssize_t status;
-
- if (sdb_proto_select(fd, SDB_PROTO_SELECTOUT))
- return -1;
-
- errno = 0;
- status = write(fd, buf, len);
- if (status < 0) {
- if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
- continue;
- if (errno == EINTR)
- continue;
-
- return status;
- }
-
- len -= (size_t)status;
- buf += status;
- }
-
- return (ssize_t)msg_len;
-} /* sdb_proto_send */
-
ssize_t
sdb_proto_marshal(char *buf, size_t buf_len, uint32_t code,
uint32_t msg_len, const char *msg)
return len;
} /* sdb_proto_marshal */
+int
+sdb_proto_unmarshal_header(sdb_strbuf_t *buf,
+ uint32_t *code, uint32_t *msg_len)
+{
+ uint32_t tmp;
+
+ if (sdb_strbuf_len(buf) < 2 * sizeof(uint32_t))
+ return -1;
+
+ tmp = sdb_proto_unmarshal_int(buf, 0);
+ if (code)
+ *code = tmp;
+ tmp = sdb_proto_unmarshal_int(buf, sizeof(uint32_t));
+ if (msg_len)
+ *msg_len = tmp;
+ return 0;
+} /* sdb_proto_unmarshal_header */
+
uint32_t
-sdb_proto_get_int(sdb_strbuf_t *buf, size_t offset)
+sdb_proto_unmarshal_int(sdb_strbuf_t *buf, size_t offset)
{
const char *data;
uint32_t n;
data += offset;
memcpy(&n, data, sizeof(n));
return ntohl(n);
-} /* sdb_proto_get_int */
+} /* sdb_proto_unmarshal_int */
/* vim: set tw=78 sw=4 ts=4 noexpandtab : */