kernel: add functions for iterating through an array of iovecs
This commit is contained in:
59
kernel/iovec.c
Normal file
59
kernel/iovec.c
Normal file
@@ -0,0 +1,59 @@
|
||||
#include <kernel/iovec.h>
|
||||
#include <kernel/libc/string.h>
|
||||
#include <kernel/util.h>
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user