X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Futils%2Fproto.c;h=f767fa21a887fdd929a32ea45f16fec656ff6b5f;hp=56ef745ff0d5f6b06336174f55538b40fd042013;hb=f1357b416c1264501958292c13c38ef8b5dece92;hpb=8dd1618e1dc92bd9bc60d78401e879caf919e37e diff --git a/src/utils/proto.c b/src/utils/proto.c index 56ef745..f767fa2 100644 --- a/src/utils/proto.c +++ b/src/utils/proto.c @@ -54,7 +54,7 @@ * been available. */ static ssize_t -marshal_int(char *buf, size_t buf_len, int64_t v) +marshal_int64(char *buf, size_t buf_len, int64_t v) { if (buf_len >= sizeof(v)) { #if __BYTE_ORDER != __BIG_ENDIAN @@ -64,7 +64,7 @@ marshal_int(char *buf, size_t buf_len, int64_t v) memcpy(buf, &v, sizeof(v)); } return sizeof(v); -} /* marshal_int */ +} /* marshal_int64 */ static ssize_t marshal_double(char *buf, size_t buf_len, double v) @@ -84,14 +84,14 @@ marshal_double(char *buf, size_t buf_len, double v) static ssize_t marshal_datetime(char *buf, size_t buf_len, sdb_time_t v) { - return marshal_int(buf, buf_len, (int64_t)v); + return marshal_int64(buf, buf_len, (int64_t)v); } /* marshal_datetime */ static ssize_t marshal_binary(char *buf, size_t buf_len, size_t len, const unsigned char *v) { uint32_t tmp = htonl((uint32_t)len); - if (buf_len >= len) { + if (buf_len >= sizeof(tmp) + len) { memcpy(buf, &tmp, sizeof(tmp)); memcpy(buf + sizeof(tmp), v, len); } @@ -102,8 +102,10 @@ static ssize_t marshal_string(char *buf, size_t buf_len, const char *v) { /* The actual string including the terminating null byte. */ - return marshal_binary(buf, buf_len, - strlen(v) + 1, (const unsigned char *)v); + size_t len = strlen(v) + 1; + if (buf_len >= len) + memcpy(buf, v, len); + return len; } /* marshal_string */ /* @@ -154,7 +156,7 @@ sdb_proto_marshal_data(char *buf, size_t buf_len, sdb_data_t *datum) return len; if (datum->type == SDB_TYPE_INTEGER) - n = marshal_int(buf, buf_len, datum->data.integer); + n = marshal_int64(buf, buf_len, datum->data.integer); else if (datum->type == SDB_TYPE_DECIMAL) n = marshal_double(buf, buf_len, datum->data.decimal); else if (datum->type == SDB_TYPE_STRING) @@ -192,7 +194,7 @@ sdb_proto_marshal_data(char *buf, size_t buf_len, sdb_data_t *datum) for (i = 0; i < datum->data.array.length; ++i) { if (type == SDB_TYPE_INTEGER) { int64_t *v = datum->data.array.values; - n = marshal_int(buf, buf_len, v[i]); + n = marshal_int64(buf, buf_len, v[i]); } else if (type == SDB_TYPE_DECIMAL) { double *v = datum->data.array.values; @@ -202,8 +204,26 @@ sdb_proto_marshal_data(char *buf, size_t buf_len, sdb_data_t *datum) char **v = datum->data.array.values; n = marshal_string(buf, buf_len, v[i]); } + else if (type == SDB_TYPE_DATETIME) { + sdb_time_t *v = datum->data.array.values; + n = marshal_datetime(buf, buf_len, v[i]); + } + else if (type == SDB_TYPE_BINARY) { + struct { + size_t length; + unsigned char *datum; + } *v = datum->data.array.values; + n = marshal_binary(buf, buf_len, v[i].length, v[i].datum); + } + else if (type == SDB_TYPE_REGEX) { + struct { + char *raw; + regex_t regex; + } *v = datum->data.array.values; + n = marshal_string(buf, buf_len, v[i].raw); + } else { - errno = ENOTSUP; + errno = EINVAL; return -1; } @@ -229,10 +249,10 @@ sdb_proto_unmarshal_header(const char *buf, size_t buf_len, if (buf_len < 2 * sizeof(uint32_t)) return -1; - tmp = sdb_proto_unmarshal_int(buf, buf_len); + tmp = sdb_proto_unmarshal_int32(buf, buf_len); if (code) *code = tmp; - tmp = sdb_proto_unmarshal_int(buf + sizeof(uint32_t), + tmp = sdb_proto_unmarshal_int32(buf + sizeof(uint32_t), buf_len - sizeof(uint32_t)); if (msg_len) *msg_len = tmp; @@ -240,7 +260,7 @@ sdb_proto_unmarshal_header(const char *buf, size_t buf_len, } /* sdb_proto_unmarshal_header */ uint32_t -sdb_proto_unmarshal_int(const char *buf, size_t buf_len) +sdb_proto_unmarshal_int32(const char *buf, size_t buf_len) { uint32_t n; @@ -250,7 +270,7 @@ sdb_proto_unmarshal_int(const char *buf, size_t buf_len) memcpy(&n, buf, sizeof(n)); return ntohl(n); -} /* sdb_proto_unmarshal_int */ +} /* sdb_proto_unmarshal_int32 */ /* vim: set tw=78 sw=4 ts=4 noexpandtab : */