X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=rnet_message.c;h=95d8b41fc225de6e302f3f963d9851bac85a0372;hb=90aec7aae80392b570170684e57f2a66751b4bdb;hp=124fa4c3b295c522260dda669eeb457d3e21d947;hpb=f2a268097531bee5f7ad9d737fda11c06162d9a5;p=cascardo%2Frnetclient.git diff --git a/rnet_message.c b/rnet_message.c index 124fa4c..95d8b41 100644 --- a/rnet_message.c +++ b/rnet_message.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2013 Thadeu Lima de Souza Cascardo + * Copyright (C) 2014 Alexandre Oliva * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -58,15 +59,25 @@ void rnet_message_del(struct rnet_message *message) free(message); } +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(message, MAX(msg->len, klen + vlen + 3))) + if ((msg->alen - msg->len) < (size_t) (klen + vlen + 3)) { + if (rnet_message_expand(message, MAX(msg->len, (size_t) (klen + vlen + 3)))) return -ENOMEM; + msg = *message; } buffer = msg->buffer + msg->len; if (klen > 0x7f || klen < 0) @@ -124,3 +135,42 @@ 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; + unsigned int i = 0; + unsigned int j; + int b; + char *key; + unsigned int klen; + /* skip first byte */ + i++; + while (i < len) { + j = (unsigned char)buffer[i]; + b = j & 0x80; + j = j & 0x7f; + i++; + key = buffer + i; + klen = j; + i += j; + j = (unsigned char)buffer[i]; + i++; + if (b) + j = j << 8 | (unsigned char)buffer[i++]; + *value = buffer + i; + *vlen = j; + i += j; + if (strlen(skey) == klen && !strncasecmp(key, skey, klen)) + return 0; + } + return 1; +}