From a00d085b816ce561840b59c1e044fd2aed271c49 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 27 Jun 2014 23:48:35 +0200 Subject: [PATCH] Implement recvfrom(2) and sendto(2). --- libc/sys/socket/recvfrom.cpp | 34 +++++++++++++++++++++++++++------- libc/sys/socket/sendto.cpp | 29 ++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/libc/sys/socket/recvfrom.cpp b/libc/sys/socket/recvfrom.cpp index 8772967e..adad2c88 100644 --- a/libc/sys/socket/recvfrom.cpp +++ b/libc/sys/socket/recvfrom.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2013. + Copyright(C) Jonas 'Sortie' Termansen 2013, 2014. This file is part of the Sortix C Library. @@ -24,12 +24,32 @@ #include -#include -#include +#include -extern "C" ssize_t recvfrom(int, void* restrict, size_t, int, - struct sockaddr* restrict, socklen_t* restrict) +extern "C" +ssize_t recvfrom(int fd, + void* restrict buffer, + size_t buffer_size, + int flags, + struct sockaddr* restrict addr, + socklen_t* restrict addrsize) { - fprintf(stderr, "%s is not implemented yet.\n", __func__); - return errno = ENOSYS, -1; + struct msghdr msghdr; + memset(&msghdr, 0, sizeof(msghdr)); + + struct iovec iovec; + iovec.iov_base = buffer; + iovec.iov_len = buffer_size; + + msghdr.msg_name = addr; + msghdr.msg_namelen = addrsize ? *addrsize : 0; + msghdr.msg_iov = &iovec; + msghdr.msg_iovlen = 1; + + ssize_t result = recvmsg(fd, &msghdr, flags); + + if ( addrsize ) + *addrsize = msghdr.msg_namelen; + + return result; } diff --git a/libc/sys/socket/sendto.cpp b/libc/sys/socket/sendto.cpp index fcbb264c..a7a23c69 100644 --- a/libc/sys/socket/sendto.cpp +++ b/libc/sys/socket/sendto.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2013. + Copyright(C) Jonas 'Sortie' Termansen 2013, 2014. This file is part of the Sortix C Library. @@ -24,12 +24,27 @@ #include -#include -#include +#include -extern "C" ssize_t sendto(int, const void*, size_t, int, const struct sockaddr*, - socklen_t) +extern "C" +ssize_t sendto(int fd, + const void* buffer, + size_t buffer_size, + int flags, + const struct sockaddr* addr, + socklen_t addrsize) { - fprintf(stderr, "%s is not implemented yet.\n", __func__); - return errno = ENOSYS, -1; + struct msghdr msghdr; + memset(&msghdr, 0, sizeof(msghdr)); + + struct iovec iovec; + iovec.iov_base = (void*) buffer; + iovec.iov_len = buffer_size; + + msghdr.msg_name = (void*) addr; + msghdr.msg_namelen = addrsize; + msghdr.msg_iov = &iovec; + msghdr.msg_iovlen = 1; + + return sendmsg(fd, &msghdr, flags); }