From: Lennart Poettering Date: Thu, 29 Aug 2024 09:46:07 +0000 (+0200) Subject: iovec-util: add iovec_append() for appending to an existing iovec X-Git-Tag: v257-rc1~530^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=664570f531235327b3de051c9548557c02136e58;p=thirdparty%2Fsystemd.git iovec-util: add iovec_append() for appending to an existing iovec --- diff --git a/src/basic/iovec-util.c b/src/basic/iovec-util.c index 4ca5c0c61e1..76f7f5f29eb 100644 --- a/src/basic/iovec-util.c +++ b/src/basic/iovec-util.c @@ -82,3 +82,15 @@ void iovec_array_free(struct iovec *iovec, size_t n_iovec) { free(iovec); } + +struct iovec* iovec_append(struct iovec *iovec, const struct iovec *append) { + assert(iovec_is_valid(iovec)); + + if (!iovec_is_set(append)) + return iovec; + + if (!greedy_realloc_append(&iovec->iov_base, &iovec->iov_len, append->iov_base, append->iov_len, 1)) + return NULL; + + return iovec; +} diff --git a/src/basic/iovec-util.h b/src/basic/iovec-util.h index b92257cb0df..868454040b4 100644 --- a/src/basic/iovec-util.h +++ b/src/basic/iovec-util.h @@ -70,3 +70,5 @@ static inline struct iovec *iovec_memdup(const struct iovec *source, struct iove return ret; } + +struct iovec* iovec_append(struct iovec *iovec, const struct iovec *append); diff --git a/src/test/test-iovec-util.c b/src/test/test-iovec-util.c index e7cc6e41418..217ee8cf5d9 100644 --- a/src/test/test-iovec-util.c +++ b/src/test/test-iovec-util.c @@ -54,4 +54,17 @@ TEST(iovec_set_and_valid) { assert_se(!iovec_is_valid(&invalid)); } +TEST(iovec_append) { + _cleanup_(iovec_done) struct iovec iov = {}; + + assert_se(iovec_append(&iov, &IOVEC_MAKE_STRING("")) == &iov); + assert_se(iovec_append(&iov, &IOVEC_MAKE_STRING("waldo")) == &iov); + assert_se(iovec_append(&iov, &IOVEC_MAKE_STRING("quux")) == &iov); + assert_se(iovec_append(&iov, &IOVEC_MAKE_STRING("")) == &iov); + assert_se(iovec_append(&iov, &IOVEC_MAKE_STRING("p")) == &iov); + assert_se(iovec_append(&iov, &IOVEC_MAKE_STRING("")) == &iov); + + assert_se(iovec_memcmp(&iov, &IOVEC_MAKE_STRING("waldoquuxp")) == 0); +} + DEFINE_TEST_MAIN(LOG_INFO);