From f52877abb45dec86a66689dc2553af426f06d8b6 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 27 May 2025 07:13:06 +0300 Subject: [PATCH] LibC: Implement `readv` and `writev` --- userspace/libraries/LibC/CMakeLists.txt | 1 + userspace/libraries/LibC/sys/uio.cpp | 46 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 userspace/libraries/LibC/sys/uio.cpp diff --git a/userspace/libraries/LibC/CMakeLists.txt b/userspace/libraries/LibC/CMakeLists.txt index 01a20abb6d..707cd0230f 100644 --- a/userspace/libraries/LibC/CMakeLists.txt +++ b/userspace/libraries/LibC/CMakeLists.txt @@ -39,6 +39,7 @@ set(LIBC_SOURCES sys/stat.cpp sys/statvfs.cpp sys/time.cpp + sys/uio.cpp sys/utsname.cpp sys/wait.cpp syslog.cpp diff --git a/userspace/libraries/LibC/sys/uio.cpp b/userspace/libraries/LibC/sys/uio.cpp new file mode 100644 index 0000000000..3871d2a8e5 --- /dev/null +++ b/userspace/libraries/LibC/sys/uio.cpp @@ -0,0 +1,46 @@ +#include +#include + +ssize_t readv(int fildes, const struct iovec* iov, int iovcnt) +{ + size_t result = 0; + for (int i = 0; i < iovcnt; i++) + { + uint8_t* base = static_cast(iov->iov_base); + + size_t nread = 0; + while (nread < iov[i].iov_len) + { + const ssize_t ret = read(fildes, base + nread, iov[i].iov_len - nread); + if (ret == -1 && result == 0) + return -1; + if (ret <= 0) + return result; + nread += ret; + } + result += nread; + } + return result; +} + +ssize_t writev(int fildes, const struct iovec* iov, int iovcnt) +{ + size_t result = 0; + for (int i = 0; i < iovcnt; i++) + { + const uint8_t* base = static_cast(iov->iov_base); + + size_t nwrite = 0; + while (nwrite < iov[i].iov_len) + { + const ssize_t ret = write(fildes, base + nwrite, iov[i].iov_len - nwrite); + if (ret == -1 && result == 0) + return -1; + if (ret <= 0) + return result; + nwrite += ret; + } + result += nwrite; + } + return result; +}