diff options
| author | Laurent Vivier <lvivier@redhat.com> | 2026-05-20 11:55:25 +0200 |
|---|---|---|
| committer | Stefano Brivio <sbrivio@redhat.com> | 2026-05-26 12:17:01 +0200 |
| commit | 9361b6bab7b7e661b1a4a6b4847800e82dad0224 (patch) | |
| tree | acbc29db2e41765378a2c386bfee740090608323 | |
| parent | 28ee143d92df5fd779a3f16b3f2717ab478584da (diff) | |
| download | passt-9361b6bab7b7e661b1a4a6b4847800e82dad0224.tar passt-9361b6bab7b7e661b1a4a6b4847800e82dad0224.tar.gz passt-9361b6bab7b7e661b1a4a6b4847800e82dad0224.tar.bz2 passt-9361b6bab7b7e661b1a4a6b4847800e82dad0224.tar.lz passt-9361b6bab7b7e661b1a4a6b4847800e82dad0224.tar.xz passt-9361b6bab7b7e661b1a4a6b4847800e82dad0224.tar.zst passt-9361b6bab7b7e661b1a4a6b4847800e82dad0224.zip | |
iov: Introduce IOV_PUSH_HEADER() macro
Add iov_push_header_() and its typed wrapper IOV_PUSH_HEADER() to write
a header into an iov_tail at the current offset and advance past it.
This is the write counterpart to IOV_PEEK_HEADER() / IOV_REMOVE_HEADER(),
using iov_from_buf() to copy the header data across iovec boundaries.
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
| -rw-r--r-- | iov.c | 31 | ||||
| -rw-r--r-- | iov.h | 11 |
2 files changed, 42 insertions, 0 deletions
@@ -360,6 +360,37 @@ void *iov_peek_header_(struct iov_tail *tail, void *v, size_t len, size_t align) } /** + * iov_push_header_() - Write a new header to an IOV tail + * @tail: IOV tail to write header to + * @v: Pointer to header data to write + * @len: Length of header to write, in bytes + * + * Return: number of bytes written + */ +/* cppcheck-suppress unusedFunction */ +size_t iov_push_header_(struct iov_tail *tail, const void *v, size_t len) +{ + size_t l; + + if (!iov_tail_prune(tail)) + return 0; /* No space */ + + if ((char *)tail->iov[0].iov_base + tail->off == v) /* already in place */ + l = len; + else + l = iov_from_buf(tail->iov, tail->cnt, tail->off, v, len); + + if (l != len) { + warn("iov_push_header_(): Not enough space to store header" + " (%zu != %zu)", l, len); + } + + tail->off = tail->off + l; + + return l; +} + +/** * iov_remove_header_() - Remove a header from an IOV tail * @tail: IOV tail to remove header from (modified) * @v: Temporary memory to use if the memory in @tail @@ -93,6 +93,7 @@ bool iov_tail_prune(struct iov_tail *tail); size_t iov_tail_size(struct iov_tail *tail); bool iov_drop_header(struct iov_tail *tail, size_t len); void *iov_peek_header_(struct iov_tail *tail, void *v, size_t len, size_t align); +size_t iov_push_header_(struct iov_tail *tail, const void *v, size_t len); void *iov_remove_header_(struct iov_tail *tail, void *v, size_t len, size_t align); ssize_t iov_tail_clone(struct iovec *dst_iov, size_t dst_iov_cnt, struct iov_tail *tail); @@ -116,6 +117,16 @@ ssize_t iov_tail_clone(struct iovec *dst_iov, size_t dst_iov_cnt, __alignof__(var_)))) /** + * IOV_PUSH_HEADER() - Write a new header to an IOV tail + * @tail_: IOV tail to write header to + * @var_: A variable containing the header data to write + * + * Return: number of bytes written + */ +#define IOV_PUSH_HEADER(tail_, var_) \ + (iov_push_header_((tail_), &(var_), sizeof(var_))) + +/** * IOV_REMOVE_HEADER() - Remove and return typed header from an IOV tail * @tail_: IOV tail to remove header from (modified) * @var_: Temporary buffer of the type of the header to use if |
