diff options
author | 2019-05-22 21:13:45 +0300 | |
---|---|---|
committer | 2019-05-22 21:13:45 +0300 | |
commit | db5f3e534c1efd31a582d2309b2bc892cc2c8317 (patch) | |
tree | 723027dca1ec5326b982dc9435d684490ab4c5a3 /src/common/protocol.c | |
parent | 54f0ba9d41b446b83090dc0f3b220db9c82491d0 (diff) | |
download | usurpation-db5f3e534c1efd31a582d2309b2bc892cc2c8317.tar.gz usurpation-db5f3e534c1efd31a582d2309b2bc892cc2c8317.tar.bz2 usurpation-db5f3e534c1efd31a582d2309b2bc892cc2c8317.zip |
Protocol: reimplemented get_tlv and added tlv_data_size.
Signed-off-by: Ramūnas Mažeikis <ramunasnezinomas@gmail.com>
Diffstat (limited to 'src/common/protocol.c')
-rw-r--r-- | src/common/protocol.c | 38 |
1 files changed, 31 insertions, 7 deletions
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 |