#include #include #include void iovec_iterator_begin( struct iovec_iterator *it, const struct iovec *vecs, size_t nr_vecs) { memset(it, 0x0, sizeof *it); it->it_vecs = vecs; it->it_nr_vecs = nr_vecs; while (it->it_vec_ptr < nr_vecs) { if (vecs[it->it_vec_ptr].io_len > 0) { break; } it->it_vec_ptr++; } if (it->it_vec_ptr >= nr_vecs) { return; } it->it_base = vecs[it->it_vec_ptr].io_base; it->it_len = vecs[it->it_vec_ptr].io_len; } void iovec_iterator_seek(struct iovec_iterator *it, size_t nr_bytes) { while (nr_bytes > 0) { size_t to_seek = MIN(nr_bytes, it->it_len); if (to_seek < it->it_len) { it->it_len -= to_seek; it->it_base += to_seek; break; } nr_bytes -= to_seek; it->it_vec_ptr++; while (it->it_vec_ptr < it->it_nr_vecs) { if (it->it_vecs[it->it_vec_ptr].io_len > 0) { break; } it->it_vec_ptr++; } if (it->it_vec_ptr >= it->it_nr_vecs) { return; } it->it_base = it->it_vecs[it->it_vec_ptr].io_base; it->it_len = it->it_vecs[it->it_vec_ptr].io_len; } }