The branch, master has been updated
       via  b9404d4 cmake: Fix a typo in socket_wrapper-config.cmake.in.
       via  71cc17a cmake: Require cmocka versin 0.4.1.
       via  916a02d tests: Add test for different length passed to 
get(sock|peer)name.
       via  9b45102 swrap: Truncate the address if the buffer is to small.
       via  b02ecdf tests: Add support to sending IP_PKTINFO in echo_srv.
       via  6f96c9d tests: Add support to receive IP_PKTINFO in echo_srv.
       via  d71c5d6 swrap: Process control messages in recvmsg().
       via  efb1249 swrap: Call swrap_msghdr_socket_info in 
swrap_recvmsg_after().
       via  1a3eac1 swrap: Add swrap_msghdr_socket_info().
       via  37dfa9b swrap: Add swrap_msghdr_add_pktinfo().
       via  c609a8a swrap: Add swrap_msghdr_add_cmsghdr().
       via  54d987e swrap: Add IP_PKTINFO support in setsockopt.
       via  ae3c84b cmake: Add check for HAVE_STRUCT_IN6_PKTINFO.
       via  0911cab cmake: Build swrap with _GNU_SOURCE.
      from  b37783b tests: Add test to verify that the binded iface address is 
correct.

http://gitweb.samba.org/?p=socket_wrapper.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit b9404d4a5f8d6295cc08514e57cc281efdcab6c6
Author: Andreas Schneider <a...@samba.org>
Date:   Thu May 22 14:56:09 2014 +0200

    cmake: Fix a typo in socket_wrapper-config.cmake.in.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 71cc17ad79e186717c5e565369b860c0cc2f2d77
Author: Andreas Schneider <a...@samba.org>
Date:   Thu May 22 08:49:07 2014 +0200

    cmake: Require cmocka versin 0.4.1.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 916a02d1f155c98f689e5ebb545331dc0f48ac2a
Author: Andreas Schneider <a...@cryptomilk.org>
Date:   Wed May 14 18:08:38 2014 +0200

    tests: Add test for different length passed to get(sock|peer)name.
    
    Signed-off-by: Andreas Schneider <a...@cryptomilk.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 9b45102df0bf3dc817533d6e478fdf56852d2db5
Author: Andreas Schneider <a...@cryptomilk.org>
Date:   Wed May 14 17:44:07 2014 +0200

    swrap: Truncate the address if the buffer is to small.
    
    Signed-off-by: Andreas Schneider <a...@cryptomilk.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit b02ecdf338ce6bcefaa91ec0a8fe3dce5b8925a8
Author: Andreas Schneider <a...@cryptomilk.org>
Date:   Wed May 14 11:28:33 2014 +0200

    tests: Add support to sending IP_PKTINFO in echo_srv.
    
    Signed-off-by: Andreas Schneider <a...@cryptomilk.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 6f96c9df7cdc2e4b80bad9cd782a9256e1f03625
Author: Andreas Schneider <a...@cryptomilk.org>
Date:   Wed May 14 10:11:37 2014 +0200

    tests: Add support to receive IP_PKTINFO in echo_srv.
    
    Signed-off-by: Andreas Schneider <a...@cryptomilk.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit d71c5d60d54048fe649be332b4267d93ae19d7ce
Author: Andreas Schneider <a...@cryptomilk.org>
Date:   Tue May 13 16:06:13 2014 +0200

    swrap: Process control messages in recvmsg().
    
    Pair-Programmed-With: Stefan Metzmacher <me...@samba.org>
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit efb124918850c340df711ed643a04fef1424c203
Author: Andreas Schneider <a...@cryptomilk.org>
Date:   Tue May 13 16:05:44 2014 +0200

    swrap: Call swrap_msghdr_socket_info in swrap_recvmsg_after().
    
    Pair-Programmed-With: Stefan Metzmacher <me...@samba.org>
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>

commit 1a3eac1c6c8f739a1da0b40f683b651475808eae
Author: Andreas Schneider <a...@cryptomilk.org>
Date:   Tue May 13 16:02:26 2014 +0200

    swrap: Add swrap_msghdr_socket_info().
    
    Pair-Programmed-With: Stefan Metzmacher <me...@samba.org>
    Pair-Programmed-With: Michael Adam <ob...@samba.org>
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Signed-off-by: Michael Adam <ob...@samba.org>

commit 37dfa9ba9484488995b4338b6e955b54ea1912aa
Author: Andreas Schneider <a...@cryptomilk.org>
Date:   Tue May 13 16:01:25 2014 +0200

    swrap: Add swrap_msghdr_add_pktinfo().
    
    Pair-Programmed-With: Stefan Metzmacher <me...@samba.org>
    Pair-Programmed-With: Michael Adam <ob...@samba.org>
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Signed-off-by: Michael Adam <ob...@samba.org>

commit c609a8a5547d0d1edc17069bcaf22bbb63802c3b
Author: Andreas Schneider <a...@samba.org>
Date:   Wed Jan 22 18:45:51 2014 +0100

    swrap: Add swrap_msghdr_add_cmsghdr().
    
    Pair-Programmed-With: Stefan Metzmacher <me...@samba.org>
    Pair-Programmed-With: Michael Adam <ob...@samba.org>
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Signed-off-by: Stefan Metzmacher <me...@samba.org>
    Signed-off-by: Michael Adam <ob...@samba.org>

commit 54d987e1316e058dea7a01853782677eaccef641
Author: Andreas Schneider <a...@samba.org>
Date:   Wed Jan 22 19:09:51 2014 +0100

    swrap: Add IP_PKTINFO support in setsockopt.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

commit ae3c84b07bc57be52c3f5d706bfeb62a7fa9ebbc
Author: Andreas Schneider <a...@samba.org>
Date:   Wed Jan 22 20:06:59 2014 +0100

    cmake: Add check for HAVE_STRUCT_IN6_PKTINFO.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

commit 0911cab2c0e18ee9e0c130ec7ddbbf457345d4f0
Author: Andreas Schneider <a...@cryptomilk.org>
Date:   Tue May 13 01:56:17 2014 +0200

    cmake: Build swrap with _GNU_SOURCE.
    
    Signed-off-by: Andreas Schneider <a...@samba.org>
    Reviewed-by: Michael Adam <ob...@samba.org>
    Reviewed-by: Stefan Metzmacher <me...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 CMakeLists.txt                           |    7 +-
 ConfigureChecks.cmake                    |    5 +
 cmake/Modules/DefineCompilerFlags.cmake  |    2 +-
 cmake/Modules/FindCMocka.cmake           |   49 -----
 config.h.cmake                           |    4 +
 socket_wrapper-config.cmake.in           |    2 +-
 src/CMakeLists.txt                       |    6 +
 src/socket_wrapper.c                     |  247 +++++++++++++++++++++++++-
 tests/CMakeLists.txt                     |    1 +
 tests/echo_srv.c                         |  288 +++++++++++++++++++++++++++++-
 tests/test_echo_tcp_get_peer_sock_name.c |   58 ++++++
 11 files changed, 600 insertions(+), 69 deletions(-)
 delete mode 100644 cmake/Modules/FindCMocka.cmake


Changeset truncated at 500 lines:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 33c2245..8e346e6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -51,9 +51,10 @@ configure_file(config.h.cmake 
${CMAKE_CURRENT_BINARY_DIR}/config.h)
 add_subdirectory(src)
 
 if (UNIT_TESTING)
-  find_package(CMocka REQUIRED)
-  include(AddCMockaTest)
-  add_subdirectory(tests)
+    find_package(cmocka 0.4.1 REQUIRED)
+
+    include(AddCMockaTest)
+    add_subdirectory(tests)
 endif (UNIT_TESTING)
 
 # pkg-config file
diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
index 8db5162..2d4c409 100644
--- a/ConfigureChecks.cmake
+++ b/ConfigureChecks.cmake
@@ -81,6 +81,11 @@ endif (UNIX)
 
 set(SWRAP_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL 
"socket_wrapper required system libraries")
 
+# STRUCTS
+set(CMAKE_REQUIRED_FLAGS -D_GNU_SOURCE)
+check_struct_has_member("struct in6_pktinfo" ipi6_addr 
"sys/types.h;sys/socket.h;netinet/in.h" HAVE_STRUCT_IN6_PKTINFO)
+set(CMAKE_REQUIRED_FLAGS)
+
 # STRUCT MEMBERS
 check_struct_has_member("struct sockaddr" sa_len 
"sys/types.h;sys/socket.h;netinet/in.h" HAVE_STRUCT_SOCKADDR_SA_LEN)
 check_struct_has_member("struct msghdr" msg_control "sys/types.h;sys/socket.h" 
HAVE_STRUCT_MSGHDR_MSG_CONTROL)
diff --git a/cmake/Modules/DefineCompilerFlags.cmake 
b/cmake/Modules/DefineCompilerFlags.cmake
index 0ab8802..e522a6a 100644
--- a/cmake/Modules/DefineCompilerFlags.cmake
+++ b/cmake/Modules/DefineCompilerFlags.cmake
@@ -10,7 +10,7 @@ if (UNIX AND NOT WIN32)
     if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
 
         # add -Wconversion ?
-        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -pedantic 
-pedantic-errors")
+        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wshadow 
-Wmissing-prototypes -Wdeclaration-after-statement")
         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused -Wfloat-equal 
-Wpointer-arith -Wwrite-strings -Wformat-security")
         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute")
diff --git a/cmake/Modules/FindCMocka.cmake b/cmake/Modules/FindCMocka.cmake
deleted file mode 100644
index 2dd9fc5..0000000
--- a/cmake/Modules/FindCMocka.cmake
+++ /dev/null
@@ -1,49 +0,0 @@
-# - Try to find CMocka
-# Once done this will define
-#
-#  CMOCKA_ROOT_DIR - Set this variable to the root installation of CMocka
-#
-# Read-Only variables:
-#  CMOCKA_FOUND - system has CMocka
-#  CMOCKA_INCLUDE_DIR - the CMocka include directory
-#  CMOCKA_LIBRARIES - Link these to use CMocka
-#  CMOCKA_DEFINITIONS - Compiler switches required for using CMocka
-#
-#=============================================================================
-#  Copyright (c) 2011-2012 Andreas Schneider <a...@cryptomilk.org>
-#
-#  Distributed under the OSI-approved BSD License (the "License");
-#  see accompanying file Copyright.txt for details.
-#
-#  This software is distributed WITHOUT ANY WARRANTY; without even the
-#  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-#  See the License for more information.
-#=============================================================================
-#
-
-find_path(CMOCKA_INCLUDE_DIR
-    NAMES
-        cmocka.h
-    PATHS
-        ${CMOCKA_ROOT_DIR}/include
-)
-
-find_library(CMOCKA_LIBRARY
-    NAMES
-        cmocka
-    PATHS
-        ${CMOCKA_ROOT_DIR}/include
-)
-
-if (CMOCKA_LIBRARY)
-  set(CMOCKA_LIBRARIES
-      ${CMOCKA_LIBRARIES}
-      ${CMOCKA_LIBRARY}
-  )
-endif (CMOCKA_LIBRARY)
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(CMocka DEFAULT_MSG CMOCKA_LIBRARIES 
CMOCKA_INCLUDE_DIR)
-
-# show the CMOCKA_INCLUDE_DIR and CMOCKA_LIBRARIES variables only in the 
advanced view
-mark_as_advanced(CMOCKA_INCLUDE_DIR CMOCKA_LIBRARIES)
diff --git a/config.h.cmake b/config.h.cmake
index efa519b..57a2f12 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -20,6 +20,10 @@
 #cmakedefine HAVE_SYS_TIMERFD_H 1
 #cmakedefine HAVE_GNU_LIB_NAMES_H 1
 
+/**************************** STRUCTS ****************************/
+
+#cmakedefine HAVE_STRUCT_IN6_PKTINFO 1
+
 /************************ STRUCT MEMBERS *************************/
 
 #cmakedefine HAVE_STRUCT_SOCKADDR_SA_LEN 1
diff --git a/socket_wrapper-config.cmake.in b/socket_wrapper-config.cmake.in
index 732d784..7bedd79 100644
--- a/socket_wrapper-config.cmake.in
+++ b/socket_wrapper-config.cmake.in
@@ -1 +1 @@
-set(SOCKET_WRAPPER_LIRBARY @LIB_INSTALL_DIR@/@SOCKET_WRAPPER_LIB@)
+set(SOCKET_WRAPPER_LIBRARY @LIB_INSTALL_DIR@/@SOCKET_WRAPPER_LIB@)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 95a691f..b1ab95f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,6 +1,12 @@
 project(libsocket_wrapper C)
 
 include_directories(${CMAKE_BINARY_DIR})
+
+set_source_files_properties(socket_wrapper.c
+    PROPERTIES
+        COMPILE_DEFINITIONS
+            _GNU_SOURCE)
+
 add_library(socket_wrapper SHARED socket_wrapper.c)
 
 target_link_libraries(socket_wrapper ${SWRAP_REQUIRED_LIBRARIES})
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index 4bca746..01a498f 100644
--- a/src/socket_wrapper.c
+++ b/src/socket_wrapper.c
@@ -119,6 +119,12 @@ enum swrap_dbglvl_e {
 #define discard_const_p(type, ptr) ((type *)discard_const(ptr))
 #endif
 
+#ifdef IPV6_PKTINFO
+# ifndef IPV6_RECVPKTINFO
+#  define IPV6_RECVPKTINFO IPV6_PKTINFO
+# endif /* IPV6_RECVPKTINFO */
+#endif /* IPV6_PKTINFO */
+
 #define SWRAP_DLIST_ADD(list,item) do { \
        if (!(list)) { \
                (item)->prev    = NULL; \
@@ -199,6 +205,7 @@ struct socket_info
        int is_server;
        int connected;
        int defer_connect;
+       int pktinfo;
 
        char *tmp_path;
 
@@ -2754,6 +2761,7 @@ int open(const char *pathname, int flags, ...)
 static int swrap_getpeername(int s, struct sockaddr *name, socklen_t *addrlen)
 {
        struct socket_info *si = find_socket_info(s);
+       socklen_t len;
 
        if (!si) {
                return libc_getpeername(s, name, addrlen);
@@ -2765,7 +2773,12 @@ static int swrap_getpeername(int s, struct sockaddr 
*name, socklen_t *addrlen)
                return -1;
        }
 
-       memcpy(name, si->peername, si->peername_len);
+       len = MIN(*addrlen, si->peername_len);
+       if (len == 0) {
+               return 0;
+       }
+
+       memcpy(name, si->peername, len);
        *addrlen = si->peername_len;
 
        return 0;
@@ -2787,12 +2800,18 @@ int getpeername(int s, struct sockaddr *name, socklen_t 
*addrlen)
 static int swrap_getsockname(int s, struct sockaddr *name, socklen_t *addrlen)
 {
        struct socket_info *si = find_socket_info(s);
+       socklen_t len;
 
        if (!si) {
                return libc_getsockname(s, name, addrlen);
        }
 
-       memcpy(name, si->myname, si->myname_len);
+       len = MIN(*addrlen, si->myname_len);
+       if (len == 0) {
+               return 0;
+       }
+
+       memcpy(name, si->myname, len);
        *addrlen = si->myname_len;
 
        return 0;
@@ -2872,9 +2891,23 @@ static int swrap_setsockopt(int s, int level, int 
optname,
 
        switch (si->family) {
        case AF_INET:
+               if (level == IPPROTO_IP) {
+#ifdef IP_PKTINFO
+                       if (optname == IP_PKTINFO) {
+                               si->pktinfo = AF_INET;
+                       }
+#endif /* IP_PKTINFO */
+               }
                return 0;
 #ifdef HAVE_IPV6
        case AF_INET6:
+               if (level == IPPROTO_IPV6) {
+#ifdef IPV6_RECVPKTINFO
+                       if (optname == IPV6_RECVPKTINFO) {
+                               si->pktinfo = AF_INET6;
+                       }
+#endif /* IPV6_PKTINFO */
+               }
                return 0;
 #endif
        default:
@@ -2943,6 +2976,153 @@ int ioctl(int s, unsigned long int r, ...)
        return rc;
 }
 
+/*****************
+ * CMSG
+ *****************/
+
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
+/**
+ * @brief Add a cmsghdr to a msghdr.
+ *
+ * This is an function to add any type of cmsghdr. It will operate on the
+ * msg->msg_control and msg->msg_controllen you pass in by adapting them to
+ * the buffer position after the added cmsg element. Hence, this function is
+ * intended to be used with an intermediate msghdr and not on the original
+ * one handed in by the client.
+ *
+ * @param[in]  msg      The msghdr to which to add the cmsg.
+ *
+ * @param[in]  level    The cmsg level to set.
+ *
+ * @param[in]  type     The cmsg type to set.
+ *
+ * @param[in]  data     The cmsg data to set.
+ *
+ * @param[in]  len      the length of the data to set.
+ */
+static void swrap_msghdr_add_cmsghdr(struct msghdr *msg,
+                                    int level,
+                                    int type,
+                                    const void *data,
+                                    size_t len)
+{
+       size_t cmlen = CMSG_LEN(len);
+       size_t cmspace = CMSG_SPACE(len);
+       uint8_t cmbuf[cmspace];
+       struct cmsghdr *cm = (struct cmsghdr *)cmbuf;
+       uint8_t *p;
+
+       memset(cmbuf, 0, cmspace);
+
+       if (msg->msg_controllen < cmlen) {
+               cmlen = msg->msg_controllen;
+               msg->msg_flags |= MSG_CTRUNC;
+       }
+
+       if (msg->msg_controllen < cmspace) {
+               cmspace = msg->msg_controllen;
+       }
+
+       /*
+        * We copy the full input data into an intermediate cmsghdr first
+        * in order to more easily cope with truncation.
+        */
+       cm->cmsg_len = cmlen;
+       cm->cmsg_level = level;
+       cm->cmsg_type = type;
+       memcpy(CMSG_DATA(cm), data, len);
+
+       /*
+        * We now copy the possibly truncated buffer.
+        * We copy cmlen bytes, but consume cmspace bytes,
+        * leaving the possible padding uninitialiazed.
+        */
+       p = (uint8_t *)msg->msg_control;
+       memcpy(p, cm, cmlen);
+       p += cmspace;
+       msg->msg_control = p;
+       msg->msg_controllen -= cmspace;
+
+       return;
+}
+
+static int swrap_msghdr_add_pktinfo(struct socket_info *si,
+                                   struct msghdr *msg)
+{
+       /* Add packet info */
+       switch (si->pktinfo) {
+#ifdef IP_PKTINFO
+       case AF_INET: {
+               struct sockaddr_in *sin;
+               struct in_pktinfo pkt;
+
+               if (si->bindname_len == sizeof(struct sockaddr_in)) {
+                       sin = (struct sockaddr_in*)si->bindname;
+               } else {
+                       if (si->myname_len != sizeof(struct sockaddr_in)) {
+                               return 0;
+                       }
+                       sin = (struct sockaddr_in*)si->myname;
+               }
+
+               ZERO_STRUCT(pkt);
+
+               pkt.ipi_ifindex = socket_wrapper_default_iface();
+               pkt.ipi_addr.s_addr = sin->sin_addr.s_addr;
+
+               swrap_msghdr_add_cmsghdr(msg, IPPROTO_IP, IP_PKTINFO,
+                                        &pkt, sizeof(pkt));
+
+               break;
+       }
+#endif /* IP_PKTINFO */
+#if defined(HAVE_IPV6)
+       case AF_INET6: {
+#if defined(IPV6_PKTINFO) && defined(HAVE_STRUCT_IN6_PKTINFO)
+               struct sockaddr_in6 *sin6;
+               struct in6_pktinfo pkt6;
+
+               if (si->bindname_len == sizeof(struct sockaddr_in6)) {
+                       sin6 = (struct sockaddr_in6*)si->bindname;
+               } else {
+                       if (si->myname_len != sizeof(struct sockaddr_in6)) {
+                               return 0;
+                       }
+                       sin6 = (struct sockaddr_in6*)si->myname;
+               }
+
+               ZERO_STRUCT(pkt6);
+
+               pkt6.ipi6_ifindex = socket_wrapper_default_iface();
+               pkt6.ipi6_addr = sin6->sin6_addr;
+
+               swrap_msghdr_add_cmsghdr(msg, IPPROTO_IPV6, IPV6_PKTINFO,
+                                       &pkt6, sizeof(pkt6));
+#endif /* HAVE_STRUCT_IN6_PKTINFO */
+
+               break;
+       }
+#endif /* IPV6_PKTINFO */
+       default:
+               return -1;
+       }
+
+       return 0;
+}
+
+static int swrap_msghdr_add_socket_info(struct socket_info *si,
+                                       struct msghdr *omsg)
+{
+       int rc = 0;
+
+       if (si->pktinfo > 0) {
+               rc = swrap_msghdr_add_pktinfo(si, omsg);
+       }
+
+       return rc;
+}
+#endif /* HAVE_STRUCT_MSGHDR_MSG_CONTROL */
+
 static ssize_t swrap_sendmsg_before(int fd,
                                    struct socket_info *si,
                                    struct msghdr *msg,
@@ -3232,6 +3412,7 @@ static int swrap_recvmsg_after(int fd,
        off_t ofs = 0;
        size_t avail = 0;
        size_t remain;
+       int rc;
 
        /* to give better errors */
        if (ret == -1) {
@@ -3248,8 +3429,8 @@ static int swrap_recvmsg_after(int fd,
        }
 
        if (avail == 0) {
-               errno = saved_errno;
-               return 0;
+               rc = 0;
+               goto done;
        }
 
        if (ret == -1) {
@@ -3292,8 +3473,6 @@ static int swrap_recvmsg_after(int fd,
                }
 
                if (un_addr != NULL) {
-                       int rc;
-
                        rc = sockaddr_convert_from_un(si,
                                                      un_addr,
                                                      un_addrlen,
@@ -3320,10 +3499,23 @@ static int swrap_recvmsg_after(int fd,
                break;
        }
 
+       rc = 0;
 done:
        free(buf);
        errno = saved_errno;
-       return 0;
+
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
+       if (rc == 0 &&
+           msg->msg_controllen > 0 &&
+           msg->msg_control != NULL) {
+               rc = swrap_msghdr_add_socket_info(si, msg);
+               if (rc < 0) {
+                       return -1;
+               }
+       }
+#endif
+
+       return rc;
 }
 
 /****************************************************************************
@@ -3683,6 +3875,8 @@ static ssize_t swrap_recvmsg(int s, struct msghdr *omsg, 
int flags)
        struct socket_info *si;
        struct msghdr msg;
        struct iovec tmp;
+       size_t msg_ctrllen_filled;
+       size_t msg_ctrllen_left;
 
        ssize_t ret;
        int rc;
@@ -3701,6 +3895,9 @@ static ssize_t swrap_recvmsg(int s, struct msghdr *omsg, 
int flags)
        msg.msg_iov = omsg->msg_iov;               /* scatter/gather array */
        msg.msg_iovlen = omsg->msg_iovlen;         /* # elements in msg_iov */
 #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
+       msg_ctrllen_filled = 0;
+       msg_ctrllen_left = omsg->msg_controllen;
+
        msg.msg_control = omsg->msg_control;       /* ancillary data, see below 
*/
        msg.msg_controllen = omsg->msg_controllen; /* ancillary data buffer len 
*/
        msg.msg_flags = omsg->msg_flags;           /* flags on received message 
*/
@@ -3713,11 +3910,45 @@ static ssize_t swrap_recvmsg(int s, struct msghdr 
*omsg, int flags)
 
        ret = libc_recvmsg(s, &msg, flags);
 
-       rc = swrap_recvmsg_after(s, si, omsg, &from_addr, from_addrlen, ret);
+       msg.msg_name = omsg->msg_name;
+       msg.msg_namelen = omsg->msg_namelen;
+
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
+       msg_ctrllen_filled += msg.msg_controllen;
+       msg_ctrllen_left -= msg.msg_controllen;
+
+       if (omsg->msg_control != NULL) {
+               uint8_t *p;
+
+               p = omsg->msg_control;
+               p += msg_ctrllen_filled;
+
+               msg.msg_control = p;
+               msg.msg_controllen = msg_ctrllen_left;
+       } else {
+               msg.msg_control = NULL;
+               msg.msg_controllen = 0;
+       }
+#endif
+
+       rc = swrap_recvmsg_after(s, si, &msg, &from_addr, from_addrlen, ret);
        if (rc != 0) {
                return rc;
        }
 
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
+       if (omsg->msg_control != NULL) {
+               /* msg.msg_controllen = space left */
+               msg_ctrllen_left = msg.msg_controllen;
+               msg_ctrllen_filled = omsg->msg_controllen - msg_ctrllen_left;
+       }
+
+       /* Update the original message length */
+       omsg->msg_controllen = msg_ctrllen_filled;
+       omsg->msg_flags = msg.msg_flags;
+#endif


-- 
Socket Wrapper Repository

Reply via email to