X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=rnet_message.c;h=f47d78c8549735f23058a946e047f00d3bbd7c5e;hb=b890aeec16fb361e7832b5d125e62e57f0b22bdc;hp=8933861e54f2f54f9f641886efd6b897a00a9aee;hpb=f998dba022f231d1cae5d90a69bdc03a8de7e25d;p=cascardo%2Flibreceita.git diff --git a/rnet_message.c b/rnet_message.c index 8933861..f47d78c 100644 --- a/rnet_message.c +++ b/rnet_message.c @@ -27,7 +27,7 @@ #define MAX(a,b) (a >= b) ? a : b #endif -static int rnet_message_expand(struct rnet_message **message, size_t len) +int rnet_message_expand(struct rnet_message **message, size_t len) { struct rnet_message *msg = *message; struct rnet_message *nmsg; @@ -58,13 +58,25 @@ void rnet_message_del(struct rnet_message *message) free(message); } -static int add_field(struct rnet_message *msg, char *key, int klen, char *val, int vlen) +int rnet_message_strip(struct rnet_message *message, size_t len) +{ + if (len > message->len) + return -1; + message->len -= len; + memmove(message->buffer, message->buffer + len, message->len); + return 0; +} + +static int add_field(struct rnet_message **message, char *key, int klen, + char *val, int vlen) { int n = 0; char *buffer; + struct rnet_message *msg = *message; if ((msg->alen - msg->len) < (klen + vlen + 3)) { - if (rnet_message_expand(&msg, MAX(msg->len, klen + vlen + 3))) + if (rnet_message_expand(message, MAX(msg->len, klen + vlen + 3))) return -ENOMEM; + msg = *message; } buffer = msg->buffer + msg->len; if (klen > 0x7f || klen < 0) @@ -95,18 +107,72 @@ static int add_field(struct rnet_message *msg, char *key, int klen, char *val, i return n; } -int rnet_message_add_u32(struct rnet_message *msg, char *key, uint32_t val) +int rnet_message_add_u32(struct rnet_message **msg, char *key, uint32_t val) { uint32_t nval = htonl(val); return add_field(msg, key, strlen(key), (char *) &nval, sizeof(val)); } -int rnet_message_add_ascii(struct rnet_message *msg, char *key, char *val) +int rnet_message_add_ascii(struct rnet_message **msg, char *key, char *val) { return add_field(msg, key, strlen(key), val, strlen(val)); } -int rnet_message_add_u8(struct rnet_message *msg, char *key, uint8_t val) +int rnet_message_add_u8(struct rnet_message **msg, char *key, uint8_t val) { return add_field(msg, key, strlen(key), (char *) &val, sizeof(val)); } + +int rnet_message_add_u16(struct rnet_message **msg, char *key, uint16_t val) +{ + uint16_t nval = htons(val); + return add_field(msg, key, strlen(key), (char *) &nval, sizeof(val)); +} + +int rnet_message_add_u64(struct rnet_message **msg, char *key, uint64_t val) +{ + uint64_t nval = htobe64(val); + return add_field(msg, key, strlen(key), (char *) &nval, sizeof(val)); +} + +int rnet_message_add_buffer(struct rnet_message **msg, char *key, + char *buffer, size_t len) +{ + return add_field(msg, key, strlen(key), buffer, len); +} + +int rnet_message_parse(struct rnet_message *msg, char *skey, + char** value, int *vlen) +{ + char * buffer = msg->buffer; + size_t len = msg->len; + int i = 0; + unsigned int j; + int b; + char *key; + int klen; + char *kcopy; + /* skip first byte */ + i++; + while (i < len) { + j = buffer[i]; + b = j & 0x80; + if (b) + ; + j = j & 0x7f; + i++; + key = buffer + i; + klen = j; + i += j; + j = buffer[i]; + i++; + if (b) + j = j << 8 | buffer[i++]; + *value = buffer + i; + *vlen = j; + i += j; + if (strlen(skey) == klen && !strncasecmp(key, skey, klen)) + return 0; + } + return 1; +}