kernel: add functions for iterating through an array of iovecs

This commit is contained in:
2026-02-19 19:19:48 +00:00
parent fc8cdf62d3
commit 821246bc16

59
kernel/iovec.c Normal file
View 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;
}
}