diff options
author | 2019-05-22 21:21:25 +0300 | |
---|---|---|
committer | 2019-05-22 21:21:25 +0300 | |
commit | 5fee4a9996158479fe5503c9acace5733660f9e9 (patch) | |
tree | bd85fcfaa1adf5530bbc006ce81a2f9270685e04 /src/common/protocol.c | |
parent | db5f3e534c1efd31a582d2309b2bc892cc2c8317 (diff) | |
download | usurpation-5fee4a9996158479fe5503c9acace5733660f9e9.tar.gz usurpation-5fee4a9996158479fe5503c9acace5733660f9e9.tar.bz2 usurpation-5fee4a9996158479fe5503c9acace5733660f9e9.zip |
Protocol: reimplemented push_bytes and push_tlv_header.
Signed-off-by: Ramūnas Mažeikis <ramunasnezinomas@gmail.com>
Diffstat (limited to 'src/common/protocol.c')
-rw-r--r-- | src/common/protocol.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/common/protocol.c b/src/common/protocol.c index 8fbd197..e71938c 100644 --- a/src/common/protocol.c +++ b/src/common/protocol.c @@ -60,17 +60,36 @@ int push_tlv(struct tlv_packet *packet, enum tlv_type type, char *data) void clear_data(struct tlv_packet *packet) { - return 0; + packet->offset = 0; + packet->type = 0; + memset(packet->data, 0, packet->size); } -static int push_bytes(struct tlv_packet *packet, size_t size) +static int push_bytes(struct tlv_packet *packet, char *data, size_t size) { - return 0; + int ret = 0; + + if (packet->offset + size >= packet->size) { + ret = E_TLV_OVERFLOW; + } else { + memcpy(packet->data + packet->offset, data, size); + packet->offset += size; + } } static int push_tlv_header(struct tlv_packet *packet, enum tlv_type type, size_t size) { - return 0; + int ret = 0; + + if (packet->offset + sizeof(type) + sizeof(size) >= packet->size) { + ret = E_TLV_OVERFLOW; + } else { + memcpy(packet->data + packet->size, type, sizeof(type)); + packet->offset += sizeof(type); + memcpy(packet->data + packet->offset, size, sizeof(size)); + packet->offset += sizeof(size); + } + return ret; } int get_tlv(struct tlv_parser *parser, struct tlv *ret) |