X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Futils%2Fproto.c;h=beaa07e98397f18876f27952ab38ed83ff673638;hp=af4215b8f987a32c5c0c264f9b5f43bbec56ed5f;hb=147e814d602f90e411a948613e85e627f5858018;hpb=7624ec9003444dbd76f03dfeda38167f3831fc48 diff --git a/src/utils/proto.c b/src/utils/proto.c index af4215b..beaa07e 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,7 +84,7 @@ 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 @@ -154,7 +154,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) @@ -164,6 +164,8 @@ sdb_proto_marshal_data(char *buf, size_t buf_len, sdb_data_t *datum) else if (datum->type == SDB_TYPE_BINARY) n = marshal_binary(buf, buf_len, datum->data.binary.length, datum->data.binary.datum); + else if (datum->type == SDB_TYPE_REGEX) + n = marshal_string(buf, buf_len, datum->data.re.raw); if (n < 0) return n; @@ -190,7 +192,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; @@ -200,8 +202,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; } @@ -227,10 +247,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; @@ -238,7 +258,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; @@ -248,7 +268,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 : */