size_t get_data(struct ring_buff *rb, void *data, size_t size)
{
    size_t dist = get_used(rb);
    if (size > dist)
        size = dist;

    dist = get_end_dist(rb, rb->tail);
    if (size < dist) {
        memcpy(data, rb->tail, size);
        rb->tail += size;
    } else {
        size_t wrap_size = size - dist;
        memcpy(data, rb->tail, dist);
        memcpy((char *)data + dist, rb->buf, wrap_size);
        rb->tail = rb->buf + wrap_size;
    }

    return size;
}
size_t put_data(struct ring_buff *rb, const void *data, size_t size)
{
        // Check if we have the space.  If not, only write what we can
        size_t dist = get_space(rb);
        if (dist < size)
                size = dist;

        dist = get_end_dist(rb, rb->head);
        if (size < dist) {
                memcpy(rb->head, data, size);
                rb->head += size;
        } else {
                size_t wrap_size = size - dist;
                memcpy(rb->head, data, dist);
                memcpy(rb->buf, dist + (char *)data, wrap_size);
                rb->head = rb->buf + wrap_size;
        }

        return size;
}