From 76ff3d42b48c0d25d505496d3e90f50fe7d6f9db Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 24 Dec 2013 11:28:13 +0100 Subject: swrap: Add swrap_recvmsg_before(). --- src/socket_wrapper.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/socket_wrapper.c') diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c index dc6ffb1..360f150 100644 --- a/src/socket_wrapper.c +++ b/src/socket_wrapper.c @@ -2814,6 +2814,55 @@ static void swrap_sendmsg_after(struct socket_info *si, errno = saved_errno; } +static int swrap_recvmsg_before(int fd, + struct socket_info *si, + struct msghdr *msg, + struct iovec *tmp_iov) +{ + size_t i, len = 0; + ssize_t ret; + + switch (si->type) { + case SOCK_STREAM: + if (!si->connected) { + errno = ENOTCONN; + return -1; + } + + if (msg->msg_iovlen == 0) { + break; + } + + for (i=0; i < msg->msg_iovlen; i++) { + size_t nlen; + nlen = len + msg->msg_iov[i].iov_len; + if (nlen > SOCKET_MAX_PACKET) { + break; + } + } + msg->msg_iovlen = i; + if (msg->msg_iovlen == 0) { + *tmp_iov = msg->msg_iov[0]; + tmp_iov->iov_len = MIN(tmp_iov->iov_len, SOCKET_MAX_PACKET); + msg->msg_iov = tmp_iov; + msg->msg_iovlen = 1; + } + break; + + case SOCK_DGRAM: + if (si->bound == 0) { + ret = swrap_auto_bind(fd, si, si->family); + if (ret == -1) return -1; + } + break; + default: + errno = EHOSTUNREACH; + return -1; + } + + return 0; +} + /**************************************************************************** * RECVFROM ***************************************************************************/ -- cgit