diff options
author | Stefan Metzmacher <metze@samba.org> | 2013-12-24 11:31:50 +0100 |
---|---|---|
committer | Andreas Schneider <asn@samba.org> | 2014-01-20 16:48:57 +0100 |
commit | 35bcc16674140864e2816cb6a5a536afaed9e597 (patch) | |
tree | 6ac3b6f53b6a22503c024ff8c300d6f3d1f7a866 | |
parent | e11fd61be098aed3ed2b16e6ed9fe12e6a8f2b13 (diff) | |
download | socket_wrapper-35bcc16674140864e2816cb6a5a536afaed9e597.tar.gz socket_wrapper-35bcc16674140864e2816cb6a5a536afaed9e597.tar.xz socket_wrapper-35bcc16674140864e2816cb6a5a536afaed9e597.zip |
swrap: Use swrap_recvmsg_* in swrap_recvfrom().
-rw-r--r-- | src/socket_wrapper.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c index a4f9799..7997025 100644 --- a/src/socket_wrapper.c +++ b/src/socket_wrapper.c @@ -2954,6 +2954,9 @@ static ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags, struct socket_info *si = find_socket_info(s); struct sockaddr_storage ss; socklen_t ss_len = sizeof(ss); + struct msghdr msg; + struct iovec tmp; + int tret; if (!si) { return libc_recvfrom(s, @@ -2969,9 +2972,22 @@ static ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags, fromlen = &ss_len; } - if (si->type == SOCK_STREAM) { - len = MIN(len, SOCKET_MAX_PACKET); - } + tmp.iov_base = buf; + tmp.iov_len = len; + + msg.msg_name = NULL; /* optional address */ + msg.msg_namelen = 0; /* size of address */ + msg.msg_iov = &tmp; /* scatter/gather array */ + msg.msg_iovlen = 1; /* # elements in msg_iov */ + msg.msg_control = NULL; /* ancillary data, see below */ + msg.msg_controllen = 0; /* ancillary data buffer len */ + msg.msg_flags = 0; /* flags on received message */ + + tret = swrap_recvmsg_before(s, si, &msg, &tmp); + if (tret == -1) return -1; + + buf = msg.msg_iov[0].iov_base; + len = msg.msg_iov[0].iov_len; /* irix 6.4 forgets to null terminate the sun_path string :-( */ memset(&un_addr, 0, sizeof(un_addr)); @@ -2981,15 +2997,20 @@ static ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags, flags, (struct sockaddr *)(void *)&un_addr, &un_addrlen); - if (ret == -1) + if (ret == -1) { return ret; - - if (sockaddr_convert_from_un(si, &un_addr, un_addrlen, - si->family, from, fromlen) == -1) { - return -1; } - swrap_dump_packet(si, from, SWRAP_RECVFROM, buf, ret); + tret = swrap_recvmsg_after(si, + &msg, + &un_addr, + un_addrlen, + from, + fromlen, + ret); + if (tret != 0) { + return tret; + } return ret; } |