From f4ba507e91cdcb9fa2a372370e7dd5ce011818bf Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sat, 4 May 2013 23:23:30 -0500 Subject: [PATCH] win32_writev(): Improve writev emulation --- src/win32.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/win32.c b/src/win32.c index 789eacce..84923753 100644 --- a/src/win32.c +++ b/src/win32.c @@ -3040,14 +3040,23 @@ win32_pwrite(int fd, const void *buf, size_t count, off_t offset) extern ssize_t win32_writev(int fd, const struct iovec *iov, int iovcnt) { - size_t total_bytes_written = 0; - for (int i = 0; i < iovcnt; i++) { - size_t bytes_written; + ssize_t total_bytes_written = 0; - bytes_written = full_write(fd, iov[i].iov_base, iov[i].iov_len); - total_bytes_written += bytes_written; - if (bytes_written != iov[i].iov_len) + if (iovcnt <= 0) { + errno = EINVAL; + return -1; + } + for (int i = 0; i < iovcnt; i++) { + ssize_t bytes_written; + + bytes_written = write(fd, iov[i].iov_base, iov[i].iov_len); + if (bytes_written >= 0) + total_bytes_written += bytes_written; + if (bytes_written != iov[i].iov_len) { + if (total_bytes_written == 0) + total_bytes_written = -1; break; + } } return total_bytes_written; } -- 2.43.0