sockets: use new iovec interface

This commit is contained in:
Matheus
2024-09-21 10:53:49 -03:00
parent 3868b667cb
commit fb2fa68752
10 changed files with 89 additions and 87 deletions
+6 -16
View File
@@ -28,10 +28,10 @@ syscallret_t syscall_recvmsg(context_t *, int fd, msghdr_t *umsghdr, int flags)
return ret;
}
void *buffer = vmm_map(NULL, buffersize, VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL);
if (buffer == NULL) {
ret.errno = ENOMEM;
goto cleanup;
if (iovec_user_check(msghdr.iov, msghdr.iovcount) == false) {
ret.errno = EFAULT;
sock_freemsghdr(&msghdr);
return ret;
}
file = fd_get(fd);
@@ -57,7 +57,6 @@ syscallret_t syscall_recvmsg(context_t *, int fd, msghdr_t *umsghdr, int flags)
sockdesc_t desc = {
.addr = &sockaddr,
.buffer = buffer,
.count = buffersize,
.flags = fileflagstovnodeflags(file->flags) | recvflags,
.donecount = 0,
@@ -66,18 +65,12 @@ syscallret_t syscall_recvmsg(context_t *, int fd, msghdr_t *umsghdr, int flags)
.ctrldone = 0
};
iovec_iterator_init(&desc.iovec_iterator, msghdr.iov, msghdr.iovcount);
ret.errno = socket->ops->recv(socket, &desc);
if (ret.errno)
goto cleanup;
uintmax_t iovoffset = 0;
for (int i = 0; i < msghdr.iovcount; ++i) {
ret.errno = usercopy_touser(msghdr.iov[i].addr, (void *)((uintptr_t)buffer + iovoffset), msghdr.iov[i].len);
if (ret.errno)
goto cleanup;
iovoffset += msghdr.iov[i].len;
}
if (msghdr.addr) {
abisockaddr_t abisockaddr;
ret.errno = sock_addrtoabiaddr(socket->type, &sockaddr, &abisockaddr);
@@ -120,9 +113,6 @@ syscallret_t syscall_recvmsg(context_t *, int fd, msghdr_t *umsghdr, int flags)
if (file)
fd_release(file);
if (buffer)
vmm_unmap(buffer, buffersize, 0);
sock_freemsghdr(&msghdr);
return ret;
}