summaryrefslogtreecommitdiffstats
path: root/src/socket_wrapper.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2013-12-24 11:28:13 +0100
committerAndreas Schneider <asn@samba.org>2014-01-20 16:48:32 +0100
commit76ff3d42b48c0d25d505496d3e90f50fe7d6f9db (patch)
tree0d4770653aea0139ea580045dc2b45fa7b321876 /src/socket_wrapper.c
parente9de990757777cb4361bdaa102851541b14681d8 (diff)
downloadsocket_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.c49
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
***************************************************************************/