|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] tools/libxc: Implement writev_exact() in the same style as write_exact()
Andrew Cooper writes ("[PATCH] tools/libxc: Implement writev_exact() in the
same style as write_exact()"):
> This implementation of writev_exact() will cope with an iovcnt greater than
> IOV_MAX because glibc will actually let this work anyway, and it is very
> useful not to have to work about this in the caller of writev_exact(). The
> caller is still required to ensure that the sum of iov_len's doesn't overflow
> a ssize_t.
...
> +int writev_exact(int fd, struct iovec *iov, int iovcnt)
> +{
> + int iov_idx = 0;
> + ssize_t len;
> +
> + while ( iov_idx < iovcnt )
> + {
> + /* Skip over iov[] enties with 0 length. */
> + while ( iov[iov_idx].iov_len == 0 )
> + if ( ++iov_idx == iovcnt )
> + return 0;
> +
> + len = writev(fd, &iov[iov_idx], MIN(iovcnt - iov_idx, IOV_MAX));
> +
> + if ( (len == -1) && (errno == EINTR) )
> + continue;
> + if ( len <= 0 )
> + return -1;
If writev does return 0, you at the very least need to set errno
before changing the return value to -1.
> + /* Check iov[] to see whether we had a partial or complete write. */
> + while ( len > 0 && (iov_idx < iovcnt) )
> + len -= iov[iov_idx++].iov_len;
> +
> + if ( len < 0 ) /* Partial write of iov[iov_idx - 1]. */
> + {
> + iov_idx--;
This logic is rather wtf! Isn't there a way of expressing it that
doesn't involve len becoming negative and unwinding iov_idx ?
> +int writev_exact(int fd, struct iovec *iov, int iovcnt);
> +/* Note - writev_exact() might modify iov. Whether it does so in practice
> + * depends on whether your system implementation of writev() returns from a
> + * partial write in the middle of an iov element. */
The second sentence should be removed. No-one is allowed to assume
that writev doesn't do so. Also, you should mention that your
writev_exact lacks the atomicity guarantee of proper writev.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |