diff --git a/src/persist.h b/src/persist.h index 1a2d34d1..4477f19a 100644 --- a/src/persist.h +++ b/src/persist.h @@ -114,6 +114,7 @@ struct P_retain{ int persist__read_string(FILE *db_fptr, char **str); +int persist__chunk_header_read_v234(FILE *db_fptr, int *chunk, int *length); int persist__client_chunk_read_v234(FILE *db_fptr, struct P_client *chunk, int db_version); int persist__client_msg_chunk_read_v234(FILE *db_fptr, struct P_client_msg *chunk); int persist__msg_store_chunk_read_v234(FILE *db_fptr, struct P_msg_store *chunk, int db_version); diff --git a/src/persist_read.c b/src/persist_read.c index 48e2d275..3c8a98fa 100644 --- a/src/persist_read.c +++ b/src/persist_read.c @@ -305,6 +305,13 @@ static int persist__sub_chunk_restore(struct mosquitto_db *db, FILE *db_fptr) return rc; } + +int persist__chunk_header_read(FILE *db_fptr, int *chunk, int *length) +{ + return persist__chunk_header_read_v234(db_fptr, chunk, length); +} + + int persist__restore(struct mosquitto_db *db) { FILE *fptr; @@ -312,8 +319,8 @@ int persist__restore(struct mosquitto_db *db) int rc = 0; uint32_t crc; dbid_t i64temp; - uint32_t i32temp, length; - uint16_t i16temp, chunk; + uint32_t i32temp; + int chunk, length; uint8_t i8temp; ssize_t rlen; char *err; @@ -358,10 +365,7 @@ int persist__restore(struct mosquitto_db *db) } } - while(rlen = fread(&i16temp, sizeof(uint16_t), 1, fptr), rlen == 1){ - chunk = ntohs(i16temp); - read_e(fptr, &i32temp, sizeof(uint32_t)); - length = ntohl(i32temp); + while(persist__chunk_header_read(fptr, &chunk, &length) == MOSQ_ERR_SUCCESS){ switch(chunk){ case DB_CHUNK_CFG: read_e(fptr, &i8temp, sizeof(uint8_t)); // shutdown diff --git a/src/persist_read_v234.c b/src/persist_read_v234.c index 8292b3ea..00a46dcc 100644 --- a/src/persist_read_v234.c +++ b/src/persist_read_v234.c @@ -36,6 +36,25 @@ Contributors: #include "util_mosq.h" +int persist__chunk_header_read_v234(FILE *db_fptr, int *chunk, int *length) +{ + size_t rlen; + uint16_t i16temp; + uint32_t i32temp; + + rlen = fread(&i16temp, sizeof(uint16_t), 1, db_fptr); + if(rlen != 1) return 1; + + rlen = fread(&i32temp, sizeof(uint32_t), 1, db_fptr); + if(rlen != 1) return 1; + + *chunk = ntohs(i16temp); + *length = ntohl(i32temp); + + return MOSQ_ERR_SUCCESS; +} + + int persist__client_chunk_read_v234(FILE *db_fptr, struct P_client *chunk, int db_version) { uint16_t i16temp;