From ccc97d8c96c6e679891cc85d29e75cf8c032ea0d Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Thu, 30 Aug 2018 22:49:32 +0100 Subject: [PATCH] Function for reading variable length ints from packet. --- lib/packet_mosq.c | 25 +++++++++++++++++++++++++ lib/packet_mosq.h | 1 + 2 files changed, 26 insertions(+) diff --git a/lib/packet_mosq.c b/lib/packet_mosq.c index ddfaef49..78916568 100644 --- a/lib/packet_mosq.c +++ b/lib/packet_mosq.c @@ -280,6 +280,31 @@ void packet__write_uint32(struct mosquitto__packet *packet, uint32_t word) } +int packet__read_varint(struct mosquitto__packet *packet, uint32_t *word) +{ + int i; + int remaining_mult = 1; + uint8_t byte; + + *word = 0; + + for(i=0; i<4; i++){ + if(packet->pos < packet->remaining_length){ + byte = packet->payload[packet->pos]; + word += (byte & 127) * remaining_mult; + remaining_mult *= 128; + packet->pos++; + if((byte & 128) == 0){ + return MOSQ_ERR_SUCCESS; + } + }else{ + return MOSQ_ERR_PROTOCOL; + } + } + return MOSQ_ERR_PROTOCOL; +} + + int packet__write(struct mosquitto *mosq) { ssize_t write_length; diff --git a/lib/packet_mosq.h b/lib/packet_mosq.h index 915605d5..56e27e2d 100644 --- a/lib/packet_mosq.h +++ b/lib/packet_mosq.h @@ -32,6 +32,7 @@ int packet__read_bytes(struct mosquitto__packet *packet, void *bytes, uint32_t c int packet__read_string(struct mosquitto__packet *packet, char **str, int *length); int packet__read_uint16(struct mosquitto__packet *packet, uint16_t *word); int packet__read_uint32(struct mosquitto__packet *packet, uint32_t *word); +int packet__read_varint(struct mosquitto__packet *packet, uint32_t *word); void packet__write_byte(struct mosquitto__packet *packet, uint8_t byte); void packet__write_bytes(struct mosquitto__packet *packet, const void *bytes, uint32_t count);