X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=rnet_message.c;h=51d84dc00a6bf1c4433f3546b96988bf3f2d6b16;hb=b875ed1319e55a2308aa3a6ec634415503030f85;hp=b967e04f4dbebe09ed46b4bf30daef6619494707;hpb=09ea96a03241092a02e8681ad189106707408132;p=cascardo%2Frnetclient.git diff --git a/rnet_message.c b/rnet_message.c index b967e04..51d84dc 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,6 +59,15 @@ 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) { @@ -125,3 +135,44 @@ 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; + /* skip first byte */ + i++; + while (i < len) { + j = (unsigned char)buffer[i]; + b = j & 0x80; + if (b) + ; + 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; +}