static struct sol_mqtt_message * sol_mqtt_message_new(const char *topic, const struct sol_buffer *payload, sol_mqtt_qos qos, bool retain) { struct sol_mqtt_message *message; SOL_NULL_CHECK(topic, NULL); SOL_NULL_CHECK(payload, NULL); message = calloc(1, sizeof(struct sol_mqtt_message)); SOL_NULL_CHECK(message, NULL); message->topic = sol_util_memdup(topic, strlen(topic) + 1); SOL_NULL_CHECK_GOTO(message->topic, topic_error); message->payload = sol_buffer_copy(payload); SOL_NULL_CHECK_GOTO(message->payload, payload_error); message->qos = qos; message->retain = retain; return message; payload_error: free(message->topic); topic_error: free(message); return NULL; }
SOL_API struct sol_buffer * sol_buffer_copy(const struct sol_buffer *buf) { struct sol_buffer *b_copy; if (!buf) return NULL; b_copy = sol_util_memdup(buf, sizeof(*buf)); if (!b_copy) return NULL; b_copy->data = sol_util_memdup(buf->data, buf->used); if (!b_copy->data) { free(b_copy); return NULL; } b_copy->flags &= ~SOL_BUFFER_FLAGS_NO_FREE; return b_copy; }
SOL_API void * sol_buffer_steal_or_copy(struct sol_buffer *buf, size_t *size) { void *r; SOL_NULL_CHECK(buf, NULL); r = sol_buffer_steal(buf, size); if (!r) { r = sol_util_memdup(buf->data, buf->used); SOL_NULL_CHECK(r, NULL); if (size) *size = buf->used; } return r; }