From fc00c656c96528112d05cf0edf8631bd5eaea446 Mon Sep 17 00:00:00 2001 From: Kacper Date: Sun, 7 Dec 2025 20:10:31 +0100 Subject: Add build system scaffolding and libc headers --- lib/libc/uio/writev.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 lib/libc/uio/writev.c (limited to 'lib/libc/uio/writev.c') diff --git a/lib/libc/uio/writev.c b/lib/libc/uio/writev.c new file mode 100644 index 00000000..4e304336 --- /dev/null +++ b/lib/libc/uio/writev.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include + +ssize_t writev(int fd, const struct iovec *iov, int iovcnt) +{ + ssize_t total = 0; + + if (iovcnt < 0) { + errno = EINVAL; + return -1; + } + + while (iovcnt > 0) { + int chunk = iovcnt > UIO_MAXIOV ? UIO_MAXIOV : iovcnt; + + struct iovec local[UIO_MAXIOV]; + memcpy(local, iov, chunk * sizeof(struct iovec)); + + ssize_t ret = syscall(writev, fd, local, chunk); + if (ret < 0) { + if (total > 0 && (errno == EAGAIN || errno == EINTR)) + return total; + return ret; + } + + total += ret; + + ssize_t remaining = ret; + while (remaining > 0 && iovcnt > 0) { + if ((size_t)remaining >= iov->iov_len) { + remaining -= iov->iov_len; + iov++; + iovcnt--; + } else { + struct iovec tmp = *iov; + tmp.iov_base = (char *)tmp.iov_base + remaining; + tmp.iov_len -= remaining; + memcpy(local, &tmp, sizeof(tmp)); + remaining = 0; + break; + } + } + } + + return total; +} -- cgit v1.2.3