diff options
author | Stefan Metzmacher <metze@samba.org> | 2013-12-24 11:28:13 +0100 |
---|---|---|
committer | Andreas Schneider <asn@samba.org> | 2014-01-20 16:48:32 +0100 |
commit | 76ff3d42b48c0d25d505496d3e90f50fe7d6f9db (patch) | |
tree | 0d4770653aea0139ea580045dc2b45fa7b321876 /src/socket_wrapper.c | |
parent | e9de990757777cb4361bdaa102851541b14681d8 (diff) | |
download | socket_wrapper-76ff3d42b48c0d25d505496d3e90f50fe7d6f9db.tar.gz socket_wrapper-76ff3d42b48c0d25d505496d3e90f50fe7d6f9db.tar.xz socket_wrapper-76ff3d42b48c0d25d505496d3e90f50fe7d6f9db.zip |
swrap: Add swrap_recvmsg_before().
Diffstat (limited to 'src/socket_wrapper.c')
-rw-r--r-- | src/socket_wrapper.c | 49 |
1 files changed, 49 insertions, 0 deletions
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 ***************************************************************************/ |