diff options
author | Alejandro Zeise <alejandro.zeise@seagate.com> | 2024-10-08 09:57:13 +0200 |
---|---|---|
committer | Daniel P. Berrangé <berrange@redhat.com> | 2024-10-10 12:33:31 +0100 |
commit | 78a5822820f9356bcd3bd8824186dd953c33028b (patch) | |
tree | 8b6e1b842c8d8359335f60f99cf9fa9613168755 /include | |
parent | 278d59601536a95a3c62af31ebd20e0bfcb833fc (diff) | |
download | qemu-78a5822820f9356bcd3bd8824186dd953c33028b.zip qemu-78a5822820f9356bcd3bd8824186dd953c33028b.tar.gz qemu-78a5822820f9356bcd3bd8824186dd953c33028b.tar.bz2 |
util/iov: Introduce iov_send_recv_with_flags()
In order to support a new update function, a flag needs to be passed
to the kernel via the socket send call (MSG_MORE) to notify it that
more data is to be expected to calculate the hash correctly.
Add a new iov helper for this purpose.
Signed-off-by: Alejandro Zeise <alejandro.zeise@seagate.com>
[ clg: - Split iov changes from original patch
- Checkpatch fixes ]
Signed-off-by: Cédric Le Goater <clg@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/qemu/iov.h | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/include/qemu/iov.h b/include/qemu/iov.h index 63a1c01..44f9db5 100644 --- a/include/qemu/iov.h +++ b/include/qemu/iov.h @@ -1,6 +1,7 @@ /* * Helpers for using (partial) iovecs. * + * Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates * Copyright (C) 2010 Red Hat, Inc. * * Author(s): @@ -76,6 +77,32 @@ size_t iov_memset(const struct iovec *iov, const unsigned int iov_cnt, size_t offset, int fillc, size_t bytes); /* + * Send/recv data from/to iovec buffers directly, with the provided + * socket flags. + * + * `offset' bytes in the beginning of iovec buffer are skipped and + * next `bytes' bytes are used, which must be within data of iovec. + * + * r = iov_send_recv_with_flags(sockfd, sockflags, iov, iovcnt, + * offset, bytes, true); + * + * is logically equivalent to + * + * char *buf = malloc(bytes); + * iov_to_buf(iov, iovcnt, offset, buf, bytes); + * r = send(sockfd, buf, bytes, sockflags); + * free(buf); + * + * For iov_send_recv_with_flags() _whole_ area being sent or received + * should be within the iovec, not only beginning of it. + */ +ssize_t iov_send_recv_with_flags(int sockfd, int sockflags, + const struct iovec *iov, + unsigned iov_cnt, size_t offset, + size_t bytes, + bool do_send); + +/* * Send/recv data from/to iovec buffers directly * * `offset' bytes in the beginning of iovec buffer are skipped and |