summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2014-01-15 16:55:20 +0100
committerAndreas Schneider <asn@samba.org>2014-01-20 18:39:04 +0100
commitae88bf8a6894df56f0be77610d47a0f3730c8804 (patch)
tree9049d3ef850b1277e5ad71dbdf314df53f0f2694
parent6d328a234f8e5557a2e6898aff4bc92ace4b8b01 (diff)
downloadsocket_wrapper-ae88bf8a6894df56f0be77610d47a0f3730c8804.tar.gz
socket_wrapper-ae88bf8a6894df56f0be77610d47a0f3730c8804.tar.xz
socket_wrapper-ae88bf8a6894df56f0be77610d47a0f3730c8804.zip
swrap: Implement recvmsg().
-rw-r--r--src/socket_wrapper.c51
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