From db5f3e534c1efd31a582d2309b2bc892cc2c8317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C5=ABnas=20Ma=C5=BEeikis?= Date: Wed, 22 May 2019 21:13:45 +0300 Subject: Protocol: reimplemented get_tlv and added tlv_data_size. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ramūnas Mažeikis --- src/common/protocol.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/common/protocol.c b/src/common/protocol.c index 5498704..8fbd197 100644 --- a/src/common/protocol.c +++ b/src/common/protocol.c @@ -34,9 +34,11 @@ #define READ_AS(type, from) (*((type*)(from))) -int push_data(enum tlv_type type) +int push_tlv(struct tlv_packet *packet, enum tlv_type type, char *data) { int ret = 0; + size_t size; + switch (type) { case TEXT: break; @@ -56,11 +58,6 @@ int push_data(enum tlv_type type) return ret; } -size_t parse_tlv(const char *data, size_t cursor, struct tlv *t) -{ - return 0; -} - void clear_data(struct tlv_packet *packet) { return 0; @@ -78,5 +75,32 @@ static int push_tlv_header(struct tlv_packet *packet, enum tlv_type type, size_t int get_tlv(struct tlv_parser *parser, struct tlv *ret) { - return 0; + int ret = 0; + + if (parser->offset + sizeof(ret->type) + sizeof(ret->length) >= parser->size) { + ret = E_TLV_OVERFLOW; + } else { + ret->type = memcpy(&ret->type, parser->data + parser->offset, sizeof(ret->type)); + parser->size += sizeof(ret->type); + ret->length = memcpy(&ret->length, parser->data + parser->offset, sizeof(ret->length)); + parser->offset += sizeof(ret->length); + if (parser->offset + ret->length >= parser->size) { + ret = E_TLV_OVERFLOW; + } else { + memcpy(ret->data, parser->data, ret->length); + } + } + return ret; } + +size_t tlv_data_size(struct tlv_parser *parser) +{ + size_t size; + + if (parser->offset + sizeof(enum tlv_type) + sizeof(size_t) >= parser->size) { + size = 0; + } else { + memcpy(&size, parser->data + parser->offset + sizeof(enum tlv_type), sizeof(size_t)); + } + return size; +} \ No newline at end of file -- cgit v1.2.3