From 821246bc16f56dafbaab6211f82f05c982eb72a1 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Thu, 19 Feb 2026 19:19:48 +0000 Subject: [PATCH] kernel: add functions for iterating through an array of iovecs --- kernel/iovec.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 kernel/iovec.c diff --git a/kernel/iovec.c b/kernel/iovec.c new file mode 100644 index 0000000..b9099fa --- /dev/null +++ b/kernel/iovec.c @@ -0,0 +1,59 @@ +#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; + } +}