]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
iovec-util: add iovec_append() for appending to an existing iovec
authorLennart Poettering <lennart@poettering.net>
Thu, 29 Aug 2024 09:46:07 +0000 (11:46 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 6 Sep 2024 13:23:14 +0000 (15:23 +0200)
src/basic/iovec-util.c
src/basic/iovec-util.h
src/test/test-iovec-util.c

index 4ca5c0c61e1c5d7468c60a835df77a5666c1b667..76f7f5f29eb4b27b57c911c11deb28d943a35543 100644 (file)
@@ -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;
+}
index b92257cb0df1df8d2bf4f9c4f970fe65fbb9a399..868454040b471e6872302cd63ab44bfba4ef8e7e 100644 (file)
@@ -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);
index e7cc6e414188d3c823e281c2dcf5e511cb696ea4..217ee8cf5d9ec9d261223ef440b77edb5b824a3a 100644 (file)
@@ -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);