X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=rnet_message.c;h=52edf143a837f08b4ff0df0e745c483371b1e683;hb=2459755a51dfddf1217c270efe87074e669a35e7;hp=124fa4c3b295c522260dda669eeb457d3e21d947;hpb=f2a268097531bee5f7ad9d737fda11c06162d9a5;p=cascardo%2Flibreceita.git diff --git a/rnet_message.c b/rnet_message.c index 124fa4c..52edf14 100644 --- a/rnet_message.c +++ b/rnet_message.c @@ -67,6 +67,7 @@ static int add_field(struct rnet_message **message, char *key, int klen, if ((msg->alen - 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) @@ -124,3 +125,45 @@ 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; +}