#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" #include #include #include "mpack/src/mpack/mpack.h" #include "main.h" request_t *client_parse_data(char *buf, size_t len) { mpack_reader_t reader; // initialize mpack_reader_init_data(&reader, buf, len); if (mpack_reader_error(&reader) != mpack_ok) { goto parse_data_finish; } size_t count = mpack_expect_map_max(&reader, 100); if (mpack_reader_error(&reader) != mpack_ok) { goto parse_data_finish; } // variables char *command = NULL; uint64_t index = 0; char *data = NULL; size_t data_len = 0; // read data for (size_t i = 0; i < count; i++) { char key[32] = {0}; mpack_expect_cstr(&reader, key, sizeof(key)); if (mpack_reader_error(&reader) != mpack_ok) { goto parse_data_finish; } if (strcmp(key, "command") == 0) { command = mpack_expect_cstr_alloc(&reader, 32); } else if (strcmp(key, "index") == 0) { index = mpack_expect_u64(&reader); } else if (strcmp(key, "data") == 0) { mpack_expect_bin(&reader); data = mpack_expect_bin_alloc(&reader, CONFIG_IMAGE_BUF_SLICE_SIZE, &data_len); } else { mpack_discard(&reader); } } parse_data_finish: if (mpack_reader_destroy(&reader) != mpack_ok) return NULL; if (!command) return NULL; request_t *req = malloc(sizeof(request_t)); if (!req) return NULL; memset(req, 0, sizeof(request_t)); req->command = command; req->index = index; req->data = data; req->data_len = data_len; return req; }