Add a function that count how many buffers from a given iovec list we need to contain a given number of bytes. It also provides how many bytes are used in the last buffer if it is not fully filled. Signed-off-by: Laurent Vivier <lvivier(a)redhat.com> --- iov.c | 35 +++++++++++++++++++++++++++++++++++ iov.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/iov.c b/iov.c index 3741db21790f..793788b5d2bc 100644 --- a/iov.c +++ b/iov.c @@ -155,3 +155,38 @@ size_t iov_size(const struct iovec *iov, size_t iov_cnt) return len; } + +/** + * iov_count - Calculate the number of I/O vectors and the size of + * the last one to store a given number of bytes. + * + * @iov: Pointer to the array of struct iovec describing the + * scatter/gather I/O vector. + * @iov_cnt: Number of elements in the iov array. + * @size: number of bytes we need to store in iovec + * @last_iov_length: output parameter, length used in the last iovec + * if return value is 0, this output parameter is + * undefined. + * + * Returns: The number of iovec needed to store @size bytes. + */ +/* cppcheck-suppress unusedFunction */ +size_t iov_count(const struct iovec *iov, size_t iov_cnt, + size_t size, size_t *last_iov_length) +{ + size_t n = 0; + + while (size && n < iov_cnt) { + if (size <= iov[n].iov_len) { + *last_iov_length = size; + return n + 1; + } + size -= iov[n].iov_len; + n++; + } + + if (n > 0) + *last_iov_length = iov[n - 1].iov_len; + + return n; +} diff --git a/iov.h b/iov.h index a9e1722713b3..0fa456d7051b 100644 --- a/iov.h +++ b/iov.h @@ -28,4 +28,6 @@ size_t iov_from_buf(const struct iovec *iov, size_t iov_cnt, size_t iov_to_buf(const struct iovec *iov, size_t iov_cnt, size_t offset, void *buf, size_t bytes); size_t iov_size(const struct iovec *iov, size_t iov_cnt); +size_t iov_count(const struct iovec *iov, size_t iov_cnt, + size_t size, size_t *last_iov_length); #endif /* IOVEC_H */ -- 2.45.2