예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}