[PATCH v2 2/2] pcapng: check if writev() returns a partial write
Stephen Hemminger
stephen at networkplumber.org
Fri Jul 29 18:00:28 CEST 2022
On Fri, 29 Jul 2022 09:18:41 +0200
Mário Kuka <kuka at cesnet.cz> wrote:
> +pcapng_writev(int fd, struct iovec *iov, const int count)
> +{
> + size_t total = 0;
> + int at = 0;
> +
> + while (at < count) {
> + /*
> + * Note: writev() can return the following on a write request:
> + * Complete:
> + * written = [sum of all iov.iov_len]
> + * Partial:
> + * written < [sum of all iov.iov_len]
> + * Deferred:
> + * written = -1, errno = [EAGAIN]
> + *
> + * Partial and deferred writes are only possible with O_NONBLOCK set.
> + *
> + * If we get a partial result, we have to call the writev() again on any ivo buffers
> + * that have not been fully written.
> + */
> + ssize_t written = writev(fd, &iov[at], count - at);
> + if (unlikely(written < 0))
> + return written;
> +
> + total += written;
> + at += pcapng_update_iov(&iov[at], count - at, written);
> + }
> +
> + return total;
Since this is being written to a file, handling partial writes makes little
sense. The only case where partial write would happen would be if filesystem
was full. Retrying just adds unnecessary complexity.
If you really want to track this, then add a dropped counter.
More information about the dev
mailing list