diff options
| author | Patrick Steinhardt <ps@pks.im> | 2026-03-13 07:45:17 +0100 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-03-13 08:54:14 -0700 |
| commit | 1970fcef93adcc5a35f6468d00a5a634d5af2b3c (patch) | |
| tree | 72a7d14cd6856beff59ccdf49a71dcda0066f06a /wrapper.c | |
| parent | 3b9b2c2a29a1d529ca9884fa0a6529f6e2496abe (diff) | |
| download | git-1970fcef93adcc5a35f6468d00a5a634d5af2b3c.tar.xz | |
wrapper: introduce writev(3p) wrappers
In the preceding commit we have added a compatibility wrapper for the
writev(3p) syscall. Introduce some generic wrappers for this function
that we nowadays take for granted in the Git codebase.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'wrapper.c')
| -rw-r--r-- | wrapper.c | 41 |
1 files changed, 41 insertions, 0 deletions
@@ -323,6 +323,47 @@ ssize_t write_in_full(int fd, const void *buf, size_t count) return total; } +ssize_t writev_in_full(int fd, struct iovec *iov, int iovcnt) +{ + ssize_t total_written = 0; + + while (iovcnt) { + ssize_t bytes_written = writev(fd, iov, iovcnt); + if (bytes_written < 0) { + if (errno == EINTR || errno == EAGAIN) + continue; + return -1; + } + if (!bytes_written) { + errno = ENOSPC; + return -1; + } + + total_written += bytes_written; + + /* + * We first need to discard any iovec entities that have been + * fully written. + */ + while (iovcnt && (size_t)bytes_written >= iov->iov_len) { + bytes_written -= iov->iov_len; + iov++; + iovcnt--; + } + + /* + * Finally, we need to adjust the last iovec in case we have + * performed a partial write. + */ + if (iovcnt && bytes_written) { + iov->iov_base = (char *) iov->iov_base + bytes_written; + iov->iov_len -= bytes_written; + } + } + + return total_written; +} + ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset) { char *p = buf; |
