diff options
author | Andreas Schneider <asn@samba.org> | 2014-01-15 16:55:20 +0100 |
---|---|---|
committer | Andreas Schneider <asn@samba.org> | 2014-01-20 18:39:04 +0100 |
commit | ae88bf8a6894df56f0be77610d47a0f3730c8804 (patch) | |
tree | 9049d3ef850b1277e5ad71dbdf314df53f0f2694 | |
parent | 6d328a234f8e5557a2e6898aff4bc92ace4b8b01 (diff) | |
download | socket_wrapper-ae88bf8a6894df56f0be77610d47a0f3730c8804.tar.gz socket_wrapper-ae88bf8a6894df56f0be77610d47a0f3730c8804.tar.xz socket_wrapper-ae88bf8a6894df56f0be77610d47a0f3730c8804.zip |
swrap: Implement recvmsg().
-rw-r--r-- | src/socket_wrapper.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c index 1f57818..b85021a 100644 --- a/src/socket_wrapper.c +++ b/src/socket_wrapper.c @@ -313,6 +313,7 @@ struct swrap_libc_fns { int flags, struct sockaddr *src_addr, socklen_t *addrlen); + int (*libc_recvmsg)(int sockfd, const struct msghdr *msg, int flags); int (*libc_send)(int sockfd, const void *buf, size_t len, int flags); int (*libc_sendmsg)(int sockfd, const struct msghdr *msg, int flags); int (*libc_sendto)(int sockfd, @@ -603,6 +604,13 @@ static int libc_recvfrom(int sockfd, return swrap.fns.libc_recvfrom(sockfd, buf, len, flags, src_addr, addrlen); } +static int libc_recvmsg(int sockfd, struct msghdr *msg, int flags) +{ + swrap_load_lib_function(SWRAP_LIBSOCKET, recvmsg); + + return swrap.fns.libc_recvmsg(sockfd, msg, flags); +} + static int libc_send(int sockfd, const void *buf, size_t len, int flags) { swrap_load_lib_function(SWRAP_LIBSOCKET, send); @@ -3310,7 +3318,48 @@ ssize_t send(int s, const void *buf, size_t len, int flags) * RECVMSG ***************************************************************************/ -/* TODO */ +static ssize_t swrap_recvmsg(int s, struct msghdr *omsg, int flags) +{ + struct sockaddr_un from_addr; + socklen_t from_addrlen = sizeof(from_addr); + struct socket_info *si; + struct msghdr msg; + struct iovec tmp; + + ssize_t ret; + int rc; + + si = find_socket_info(s); + if (si == NULL) { + return libc_recvmsg(s, omsg, flags); + } + + rc = swrap_recvmsg_before(s, si, omsg, &tmp); + if (rc == -1) { + return -1; + } + + msg = *omsg; + tmp.iov_base = msg.msg_iov; + tmp.iov_len = msg.msg_iovlen; + + msg.msg_name = (struct sockaddr *)&from_addr; + msg.msg_namelen = from_addrlen; + + ret = libc_recvmsg(s, &msg, flags); + + rc = swrap_recvmsg_after(si, omsg, &from_addr, from_addrlen, ret); + if (rc != 0) { + return rc; + } + + return ret; +} + +ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags) +{ + return swrap_recvmsg(sockfd, msg, flags); +} /**************************************************************************** * SENDMSG |