LibC: Implement `readv` and `writev`

This commit is contained in:
Bananymous 2025-05-27 07:13:06 +03:00
parent ee7c9b6731
commit f52877abb4
2 changed files with 47 additions and 0 deletions

View File

@ -39,6 +39,7 @@ set(LIBC_SOURCES
sys/stat.cpp sys/stat.cpp
sys/statvfs.cpp sys/statvfs.cpp
sys/time.cpp sys/time.cpp
sys/uio.cpp
sys/utsname.cpp sys/utsname.cpp
sys/wait.cpp sys/wait.cpp
syslog.cpp syslog.cpp

View File

@ -0,0 +1,46 @@
#include <sys/uio.h>
#include <unistd.h>
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<uint8_t*>(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<const uint8_t*>(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;
}