diff options
| author | Stefan Metzmacher <metze@samba.org> | 2013-12-24 11:35:16 +0100 |
|---|---|---|
| committer | Andreas Schneider <asn@samba.org> | 2014-01-20 16:49:05 +0100 |
| commit | 7e5f1f5abc66dff745cb4cc2bcf187189fa19d12 (patch) | |
| tree | 989580c275e25318294a1435dd8124ad3d382854 /src | |
| parent | 35bcc16674140864e2816cb6a5a536afaed9e597 (diff) | |
| download | socket_wrapper-7e5f1f5abc66dff745cb4cc2bcf187189fa19d12.tar.gz socket_wrapper-7e5f1f5abc66dff745cb4cc2bcf187189fa19d12.tar.xz socket_wrapper-7e5f1f5abc66dff745cb4cc2bcf187189fa19d12.zip | |
swrap: Use swrap_recvmsg_* in swrap_recv().
Diffstat (limited to 'src')
| -rw-r--r-- | src/socket_wrapper.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c index 7997025..e4fa64d 100644 --- a/src/socket_wrapper.c +++ b/src/socket_wrapper.c @@ -3116,24 +3116,42 @@ ssize_t sendto(int s, const void *buf, size_t len, int flags, static ssize_t swrap_recv(int s, void *buf, size_t len, int flags) { + struct socket_info *si; + struct msghdr msg; + struct iovec tmp; ssize_t ret; - struct socket_info *si = find_socket_info(s); + int tret; - if (!si) { + si = find_socket_info(s); + if (si == NULL) { return libc_recv(s, buf, len, flags); } - 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 */ + + ret = swrap_recvmsg_before(s, si, &msg, &tmp); + if (ret == -1) { + SWRAP_LOG(SWRAP_LOG_ERROR, "swrap_recvmsg_before failed"); + return -1; } + buf = msg.msg_iov[0].iov_base; + len = msg.msg_iov[0].iov_len; + ret = libc_recv(s, buf, len, flags); - if (ret == -1 && errno != EAGAIN && errno != ENOBUFS) { - swrap_dump_packet(si, NULL, SWRAP_RECV_RST, NULL, 0); - } else if (ret == 0) { /* END OF FILE */ - swrap_dump_packet(si, NULL, SWRAP_RECV_RST, NULL, 0); - } else if (ret > 0) { - swrap_dump_packet(si, NULL, SWRAP_RECV, buf, ret); + + tret = swrap_recvmsg_after(si, &msg, NULL, 0, NULL, NULL, ret); + if (tret != 0) { + return tret; } return ret; |
