The branch, master has been updated
       via  e76fb99 swrap: Fix fd-passing for Python 3.14's ProcessPoolExecutor
       via  64023cd swrap: Add debugging what fd types are being passed
       via  bf12b3b swrap: Add socket_wrapper_debug_level()
       via  3966d40 tests: Add reproducer for python >= 3.14 fd passing problem
       via  bb61fee swrap: Use `struct swrap_address_ip_only` in `struct 
socket_info`
       via  d23916e swrap: Add `struct swrap_address_ip_only` and helpers
       via  28d7701 swrap: Use bitfields for boolean members in `struct 
socket_info`
       via  41fece6 swrap: Use uint16_t for pktinfo
       via  2d4a311 swrap: Use uint16_t for the family
       via  555d393 tests: Add helper to calc the size for 
unix_scm_rights_payload array
       via  13e97ce tests: Reduce runtime from 60 sec to 12 sec
       via  a79b0c0 tests: Removed unused includes from swrap_fake_uid_wrapper.c
       via  b25e2ea tests: Prepare test to compile with cmocka 2.0
       via  3c5f514 Revert "swrap: Allow to pass 8 fds"
      from  89f9c3c swrap: Allow to pass 8 fds

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


- Log -----------------------------------------------------------------
commit e76fb993fe424dcd96d54b9623b120c4cc5a789e
Author: Andreas Schneider <[email protected]>
Date:   Mon Nov 24 17:49:37 2025 +0100

    swrap: Fix fd-passing for Python 3.14's ProcessPoolExecutor
    
    ./tests/calc_unix_scm_rights_payload:
    
    Current configuration:
      SWRAP_MAX_PASSED_FDS = 16
      SWRAP_MAX_PASSED_SOCKET_INFO = 16
      sizeof(struct socket_info) = 240 bytes
      sizeof(struct swrap_unix_scm_rights) = 3904 bytes
    
    PIPE_BUF = 4096 bytes
    Header size (offsetof payload) = 40 bytes
    Payload base size (offsetof idxs) = 1 bytes
    Available space for arrays = 4055 bytes
    
    Calculated maximum values:
      SWRAP_MAX_PASSED_FDS = 16
      SWRAP_MAX_PASSED_SOCKET_INFO = 16
    
    Verification:
      Calculated total size (struct swrap_unix_scm_rights) = 3897 bytes
      Space used = 95.1% of PIPE_BUF
      Space remaining = 199 bytes
      Fits in PIPE_BUF: YES
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 64023cd4b756ee745a5498619a6066f5e637efe2
Author: Andreas Schneider <[email protected]>
Date:   Mon Nov 24 17:53:52 2025 +0100

    swrap: Add debugging what fd types are being passed
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit bf12b3bb899146c311caff35dc9a5f0ebbbd1d03
Author: Andreas Schneider <[email protected]>
Date:   Thu Nov 27 09:49:19 2025 +0100

    swrap: Add socket_wrapper_debug_level()
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 3966d40904d4ce26a86d44ff253f6d69eee4e5ea
Author: Andreas Schneider <[email protected]>
Date:   Mon Nov 24 17:25:02 2025 +0100

    tests: Add reproducer for python >= 3.14 fd passing problem
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit bb61feedc10205119c31fea9ca0247a9b27be2b2
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 25 13:37:34 2025 +0100

    swrap: Use `struct swrap_address_ip_only` in `struct socket_info`
    
    Before: sizeof(struct socket_info) = 568 bytes
    After:  sizeof(struct socket_info) = 240 bytes
    
    Current configuration:
      SWRAP_MAX_PASSED_FDS = 6
      SWRAP_MAX_PASSED_SOCKET_INFO = 6
      sizeof(struct socket_info) = 240 bytes
      sizeof(struct swrap_unix_scm_rights) = 1488 bytes
    
    PIPE_BUF = 4096 bytes
    Header size (offsetof payload) = 40 bytes
    Payload base size (offsetof idxs) = 1 bytes
    Available space for arrays = 4055 bytes
    
    Calculated maximum values:
      SWRAP_MAX_PASSED_FDS = 16
      SWRAP_MAX_PASSED_SOCKET_INFO = 16
    
    Verification:
      Calculated total size (struct swrap_unix_scm_rights) = 3897 bytes
      Space used = 95.1% of PIPE_BUF
      Space remaining = 199 bytes
      Fits in PIPE_BUF: YES
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit d23916ecd7f81ab47b9818a3d4d42f687afbc1d3
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 25 13:37:02 2025 +0100

    swrap: Add `struct swrap_address_ip_only` and helpers
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 28d77017e9b474ab2c19915c965afe8a10de3af9
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 25 10:14:51 2025 +0100

    swrap: Use bitfields for boolean members in `struct socket_info`
    
    Before: sizeof(struct socket_info) = 596 bytes
    After:  sizeof(struct socket_info) = 568 bytes
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 41fece649cf3b73b062ee78a6dd429e853d1abbf
Author: Andreas Schneider <[email protected]>
Date:   Wed Sep 10 11:31:03 2025 +0200

    swrap: Use uint16_t for pktinfo
    
    Before: sizeof(struct socket_info) = 600 bytes
    After:  sizeof(struct socket_info) = 596 bytes
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 2d4a3115607f76dac89765c6e676247892d285eb
Author: Andreas Schneider <[email protected]>
Date:   Wed Sep 10 11:16:54 2025 +0200

    swrap: Use uint16_t for the family
    
    Before: sizeof(struct socket_info) = 600 bytes
    After:  sizeof(struct socket_info) = 600 bytes
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 555d393f6e8003cc736afc5e2e6a1daa78f5b139
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 25 11:17:22 2025 +0100

    tests: Add helper to calc the size for unix_scm_rights_payload array
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 13e97cefa9450715fca33f5205fe8eb5014ff56d
Author: Andreas Schneider <[email protected]>
Date:   Tue Nov 25 13:53:37 2025 +0100

    tests: Reduce runtime from 60 sec to 12 sec
    
    200msec should be enough.
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit a79b0c0c34e033a0c20fd427eff75ffed11bd5bf
Author: Andreas Schneider <[email protected]>
Date:   Thu Nov 27 10:41:55 2025 +0100

    tests: Removed unused includes from swrap_fake_uid_wrapper.c
    
    Fixes building on FreeBSD.
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit b25e2eaf205e52ab65fadc52b03e30b3a3ae75db
Author: Andreas Schneider <[email protected]>
Date:   Mon Nov 24 15:57:47 2025 +0100

    tests: Prepare test to compile with cmocka 2.0
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 3c5f514b3069d7a94310f2e67aa766a1f30f5b91
Author: Andreas Schneider <[email protected]>
Date:   Wed Sep 10 11:51:30 2025 +0200

    Revert "swrap: Allow to pass 8 fds"
    
    This doesn't fit into PIPE_BUF :-(
    
    This reverts commit 89f9c3c62d17116a782728863d038d6c99d49ab4.
    
    Signed-off-by: Andreas Schneider <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

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

Summary of changes:
 src/socket_wrapper.c                     | 430 +++++++++++++++++++++++++------
 tests/CMakeLists.txt                     |  79 ++++++
 tests/calc_unix_scm_rights_payload.c     |  75 ++++++
 tests/python_concurency_reproducer.py    |  32 +++
 tests/swrap_fake_uid_wrapper.c           |  17 +-
 tests/test_echo_tcp_get_peer_sock_name.c |   4 +
 tests/test_echo_tcp_poll.c               |   2 +-
 7 files changed, 541 insertions(+), 98 deletions(-)
 create mode 100644 tests/calc_unix_scm_rights_payload.c
 create mode 100755 tests/python_concurency_reproducer.py


Changeset truncated at 500 lines:

diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index 54eb239..34918ac 100644
--- a/src/socket_wrapper.c
+++ b/src/socket_wrapper.c
@@ -314,6 +314,16 @@ struct swrap_address {
        } sa;
 };
 
+struct swrap_address_ip_only {
+       union {
+               struct sockaddr s;
+               struct sockaddr_in in;
+#ifdef HAVE_IPV6
+               struct sockaddr_in6 in6;
+#endif
+       } sa;
+};
+
 static int first_free;
 
 struct socket_info
@@ -323,28 +333,30 @@ struct socket_info
         * on any change.
         */
 
-       int family;
+       uint16_t family;
+       uint16_t pktinfo;
        int type_flags; /* SOCK_CLOEXEC or SOCK_NONBLOCK */
        int type;
        int protocol;
        int opt_type;
        int opt_protocol;
-       int bound;
-       int bcast;
-       int is_server;
-       int connected;
-       int defer_connect;
-       int pktinfo;
-       int tcp_nodelay;
-       int listening;
        int fd_passed;
 
+       /* Use bitfields for boolean types */
+       unsigned int bound:1;
+       unsigned int bcast:1;
+       unsigned int is_server:1;
+       unsigned int connected:1;
+       unsigned int defer_connect:1;
+       unsigned int tcp_nodelay:1;
+       unsigned int listening:1;
+
        /* The unix path so we can unlink it on close() */
        struct sockaddr_un un_addr;
 
-       struct swrap_address bindname;
-       struct swrap_address myname;
-       struct swrap_address peername;
+       struct swrap_address_ip_only bindname;
+       struct swrap_address_ip_only myname;
+       struct swrap_address_ip_only peername;
 
        struct {
                unsigned long pck_snd;
@@ -436,6 +448,59 @@ static const char *getprogname(void)
 }
 #endif /* HAVE_GETPROGNAME */
 
+static int swrap_debug_level = SWRAP_LOG_ERROR;
+
+static void __socket_wrapper_debug_level_once(void)
+{
+       const char *env = NULL;
+       size_t env_len;
+
+       env = getenv("SOCKET_WRAPPER_DEBUGLEVEL");
+       if (env == NULL) {
+               swrap_debug_level = SWRAP_LOG_ERROR;
+               return;
+       }
+
+       env_len = strlen(env);
+       /* Sanity check: must not be empty and not longer than "warning" */
+       if (env_len == 0 || env_len > 7) {
+               swrap_debug_level = SWRAP_LOG_ERROR;
+               return;
+       }
+
+       /* Check for string values (case-insensitive) */
+       if (strcasecmp(env, "error") == 0) {
+               swrap_debug_level = SWRAP_LOG_ERROR;
+       } else if (strcasecmp(env, "warn") == 0 ||
+                  strcasecmp(env, "warning") == 0)
+       {
+               swrap_debug_level = SWRAP_LOG_WARN;
+       } else if (strcasecmp(env, "debug") == 0) {
+               swrap_debug_level = SWRAP_LOG_DEBUG;
+       } else if (strcasecmp(env, "trace") == 0) {
+               swrap_debug_level = SWRAP_LOG_TRACE;
+       } else {
+               /* Numeric value */
+               swrap_debug_level = atoi(env);
+
+               /* Clamp to valid range */
+               if (swrap_debug_level < SWRAP_LOG_ERROR) {
+                       swrap_debug_level = SWRAP_LOG_ERROR;
+               } else if (swrap_debug_level > SWRAP_LOG_TRACE) {
+                       swrap_debug_level = SWRAP_LOG_TRACE;
+               }
+       }
+}
+
+static unsigned int socket_wrapper_debug_level(void)
+{
+       static pthread_once_t debug_level_once = PTHREAD_ONCE_INIT;
+
+       pthread_once(&debug_level_once, __socket_wrapper_debug_level_once);
+
+       return (unsigned int)swrap_debug_level;
+}
+
 static void swrap_log(enum swrap_dbglvl_e dbglvl, const char *func, const char 
*format, ...) PRINTF_ATTRIBUTE(3, 4);
 # define SWRAP_LOG(dbglvl, ...) swrap_log((dbglvl), __func__, __VA_ARGS__)
 
@@ -445,15 +510,11 @@ static void swrap_log(enum swrap_dbglvl_e dbglvl,
 {
        char buffer[1024];
        va_list va;
-       const char *d;
-       unsigned int lvl = 0;
+       unsigned int lvl;
        const char *prefix = "SWRAP";
        const char *progname = getprogname();
 
-       d = getenv("SOCKET_WRAPPER_DEBUGLEVEL");
-       if (d != NULL) {
-               lvl = atoi(d);
-       }
+       lvl = socket_wrapper_debug_level();
 
        if (lvl < dbglvl) {
                return;
@@ -491,6 +552,146 @@ static void swrap_log(enum swrap_dbglvl_e dbglvl,
                buffer);
 }
 
+/*********************************************************
+ * HELPER FUNCTIONS
+ **********************************************************/
+
+/*
+ * Get the socklen for an address family
+ */
+static inline socklen_t swrap_address_ip_only_socklen(sa_family_t family)
+{
+       switch (family) {
+       case AF_UNSPEC: /* AF_UNSPEC indicates uninitialized/empty address */
+               return 0;
+       case AF_INET:
+               return sizeof(struct sockaddr_in);
+#ifdef HAVE_IPV6
+       case AF_INET6:
+               return sizeof(struct sockaddr_in6);
+#endif
+       default:
+               SWRAP_LOG(SWRAP_LOG_ERROR,
+                         "BUG: unexpected address family %d",
+                         family);
+               abort();
+       }
+
+       return 0; /* Never reached */
+}
+
+/*
+ * Get the socklen from a swrap_address_ip_only struct
+ */
+static inline socklen_t swrap_address_ip_only_len(
+       const struct swrap_address_ip_only *addr)
+{
+       return swrap_address_ip_only_socklen(addr->sa.s.sa_family);
+}
+
+/*
+ * Copy a sockaddr to swrap_address_ip_only, using the actual address size
+ * based on the address family.
+ */
+static inline void swrap_address_ip_only_from_sockaddr(
+       struct swrap_address_ip_only *dest,
+       const struct sockaddr *src,
+       socklen_t addrlen)
+{
+       socklen_t copy_len = swrap_address_ip_only_socklen(src->sa_family);
+
+       /* AF_UNSPEC means empty/unbind - zero the entire struct */
+       if (copy_len == 0) {
+               memset(&dest->sa, 0, sizeof(dest->sa));
+               return;
+       }
+
+       if (addrlen < copy_len) {
+               copy_len = addrlen;
+       }
+
+       memcpy(&dest->sa.s, src, copy_len);
+
+       /* Zero out any remaining bytes in the union */
+       if (copy_len < sizeof(dest->sa)) {
+               memset((char *)&dest->sa.s + copy_len,
+                      0,
+                      sizeof(dest->sa) - copy_len);
+       }
+}
+
+/*
+ * Copy from swrap_address (with larger union) to swrap_address_ip_only.
+ * Only allows AF_INET and AF_INET6 addresses.
+ */
+static inline void swrap_address_ip_only_from_swrap_address(
+       struct swrap_address_ip_only *dest,
+       const struct swrap_address *src)
+{
+       const struct sockaddr *sa = &src->sa.s;
+       size_t expected_len;
+
+       /* Validate address family and size */
+       switch (sa->sa_family) {
+       case AF_INET:
+               expected_len = sizeof(struct sockaddr_in);
+               if (src->sa_socklen > expected_len) {
+                       SWRAP_LOG(SWRAP_LOG_ERROR,
+                                 "BUG: IPv4 address size=%u > "
+                                 "sizeof(sockaddr_in)=%zu",
+                                 src->sa_socklen,
+                                 expected_len);
+                       abort();
+               }
+               break;
+#ifdef HAVE_IPV6
+       case AF_INET6:
+               expected_len = sizeof(struct sockaddr_in6);
+               if (src->sa_socklen > expected_len) {
+                       SWRAP_LOG(SWRAP_LOG_ERROR,
+                                 "BUG: IPv6 address size=%u > "
+                                 "sizeof(sockaddr_in6)=%zu",
+                                 src->sa_socklen,
+                                 expected_len);
+                       abort();
+               }
+               break;
+#endif
+       default:
+               SWRAP_LOG(SWRAP_LOG_ERROR,
+                         "BUG: unexpected address family %d (expected AF_INET "
+                         "or AF_INET6)",
+                         sa->sa_family);
+               abort();
+       }
+
+       memcpy(&dest->sa.s, &src->sa.s, src->sa_socklen);
+
+       /* Zero out any remaining bytes in the union */
+       if (src->sa_socklen < sizeof(dest->sa)) {
+               memset((char *)&dest->sa.s + src->sa_socklen,
+                      0,
+                      sizeof(dest->sa) - src->sa_socklen);
+       }
+}
+
+/* Copy between two swrap_address_ip_only structs */
+static inline void swrap_address_ip_only_copy(
+       struct swrap_address_ip_only *dest,
+       const struct swrap_address_ip_only *src)
+{
+       socklen_t copy_len = swrap_address_ip_only_socklen(src->sa.s.sa_family);
+
+       memcpy(&dest->sa.s, &src->sa.s, copy_len);
+
+       /* Zero out any remaining bytes in the union */
+       if (copy_len < sizeof(dest->sa)) {
+               memset((char *)&dest->sa.s + copy_len,
+                      0,
+                      sizeof(dest->sa) - copy_len);
+       }
+}
+
 /*********************************************************
  * SWRAP LOADING LIBC FUNCTIONS
  *********************************************************/
@@ -1670,7 +1871,7 @@ static const struct in6_addr *swrap_ipv6(void)
 }
 #endif
 
-static void set_port(int family, int prt, struct swrap_address *addr)
+static void set_port(int family, int prt, struct swrap_address_ip_only *addr)
 {
        switch (family) {
        case AF_INET:
@@ -2534,15 +2735,15 @@ static int convert_in_un_alloc(struct socket_info *si, 
const struct sockaddr *in
                }
 
                /* Store the bind address for connect() */
-               if (si->bindname.sa_socklen == 0) {
+               if (si->bindname.sa.s.sa_family == AF_UNSPEC) {
                        struct sockaddr_in bind_in;
                        socklen_t blen = sizeof(struct sockaddr_in);
 
                        ZERO_STRUCT(bind_in);
                        bind_in.sin_family = in->sin_family;
                        bind_in.sin_port = in->sin_port;
-                       bind_in.sin_addr.s_addr = 
htonl(swrap_ipv4_iface(iface));
-                       si->bindname.sa_socklen = blen;
+                       bind_in.sin_addr.s_addr = htonl(
+                               swrap_ipv4_iface(iface));
                        memcpy(&si->bindname.sa.in, &bind_in, blen);
                }
 
@@ -2584,7 +2785,7 @@ static int convert_in_un_alloc(struct socket_info *si, 
const struct sockaddr *in
                }
 
                /* Store the bind address for connect() */
-               if (si->bindname.sa_socklen == 0) {
+               if (si->bindname.sa.s.sa_family == AF_UNSPEC) {
                        struct sockaddr_in6 bind_in;
                        socklen_t blen = sizeof(struct sockaddr_in6);
 
@@ -2596,7 +2797,6 @@ static int convert_in_un_alloc(struct socket_info *si, 
const struct sockaddr *in
                        bind_in.sin6_addr.s6_addr[15] = iface;
 
                        memcpy(&si->bindname.sa.in6, &bind_in, blen);
-                       si->bindname.sa_socklen = blen;
                }
 
                break;
@@ -3820,8 +4020,7 @@ static int swrap_socket(int family, int type, int 
protocol, int allow_quic)
                        .sin_family = AF_INET,
                };
 
-               si->myname.sa_socklen = sizeof(struct sockaddr_in);
-               memcpy(&si->myname.sa.in, &sin, si->myname.sa_socklen);
+               memcpy(&si->myname.sa.in, &sin, sizeof(struct sockaddr_in));
                break;
        }
 #ifdef HAVE_IPV6
@@ -3830,8 +4029,7 @@ static int swrap_socket(int family, int type, int 
protocol, int allow_quic)
                        .sin6_family = AF_INET6,
                };
 
-               si->myname.sa_socklen = sizeof(struct sockaddr_in6);
-               memcpy(&si->myname.sa.in6, &sin6, si->myname.sa_socklen);
+               memcpy(&si->myname.sa.in6, &sin6, sizeof(struct sockaddr_in6));
                break;
        }
 #endif
@@ -4087,10 +4285,7 @@ static int swrap_accept(int s,
 
        SWRAP_UNLOCK_SI(parent_si);
 
-       child_si->peername = (struct swrap_address) {
-               .sa_socklen = in_addr.sa_socklen,
-       };
-       memcpy(&child_si->peername.sa.ss, &in_addr.sa.ss, in_addr.sa_socklen);
+       swrap_address_ip_only_from_swrap_address(&child_si->peername, &in_addr);
 
        if (addr != NULL && addrlen != NULL) {
                size_t copy_len = MIN(*addrlen, in_addr.sa_socklen);
@@ -4117,10 +4312,8 @@ static int swrap_accept(int s,
                  "accept() path=%s, fd=%d",
                  un_my_addr.sa.un.sun_path, s);
 
-       child_si->myname = (struct swrap_address) {
-               .sa_socklen = in_my_addr.sa_socklen,
-       };
-       memcpy(&child_si->myname.sa.ss, &in_my_addr.sa.ss, 
in_my_addr.sa_socklen);
+       swrap_address_ip_only_from_swrap_address(&child_si->myname,
+                                                &in_my_addr);
 
        idx = swrap_create_socket(&new_si, fd);
        if (idx == -1) {
@@ -4212,10 +4405,7 @@ static int swrap_auto_bind(int fd, struct socket_info 
*si, int family)
                in.sin_addr.s_addr = htonl(swrap_ipv4_iface(
                                           socket_wrapper_default_iface()));
 
-               si->myname = (struct swrap_address) {
-                       .sa_socklen = sizeof(in),
-               };
-               memcpy(&si->myname.sa.in, &in, si->myname.sa_socklen);
+               memcpy(&si->myname.sa.in, &in, sizeof(in));
                break;
        }
 #ifdef HAVE_IPV6
@@ -4246,10 +4436,7 @@ static int swrap_auto_bind(int fd, struct socket_info 
*si, int family)
                in6.sin6_addr = *swrap_ipv6();
                in6.sin6_addr.s6_addr[15] = socket_wrapper_default_iface();
 
-               si->myname = (struct swrap_address) {
-                       .sa_socklen = sizeof(in6),
-               };
-               memcpy(&si->myname.sa.in6, &in6, si->myname.sa_socklen);
+               memcpy(&si->myname.sa.in6, &in6, sizeof(in6));
                break;
        }
 #endif
@@ -4387,11 +4574,9 @@ static int swrap_connect(int s, const struct sockaddr 
*serv_addr,
        }
 
        if (ret == 0) {
-               si->peername = (struct swrap_address) {
-                       .sa_socklen = addrlen,
-               };
-
-               memcpy(&si->peername.sa.ss, serv_addr, addrlen);
+               swrap_address_ip_only_from_sockaddr(&si->peername,
+                                                   serv_addr,
+                                                   addrlen);
                si->connected = 1;
 
                /*
@@ -4401,18 +4586,12 @@ static int swrap_connect(int s, const struct sockaddr 
*serv_addr,
                 * but here we have to update the name so getsockname()
                 * returns correct information.
                 */
-               if (si->bindname.sa_socklen > 0) {
-                       si->myname = (struct swrap_address) {
-                               .sa_socklen = si->bindname.sa_socklen,
-                       };
-
-                       memcpy(&si->myname.sa.ss,
-                              &si->bindname.sa.ss,
-                              si->bindname.sa_socklen);
+               if (swrap_address_ip_only_len(&si->bindname) > 0) {
+                       swrap_address_ip_only_copy(&si->myname, &si->bindname);
 
                        /* Cleanup bindname */
-                       si->bindname = (struct swrap_address) {
-                               .sa_socklen = 0,
+                       si->bindname = (struct swrap_address_ip_only){
+                               .sa.s.sa_family = AF_UNSPEC,
                        };
                }
 
@@ -4446,6 +4625,7 @@ static int swrap_bind(int s, const struct sockaddr 
*myaddr, socklen_t addrlen)
        struct swrap_sockaddr_buf buf = {};
        int ret_errno = errno;
        int bind_error = 0;
+       int bcast = 0;
 #if 0 /* FIXME */
        bool in_use;
 #endif
@@ -4516,20 +4696,21 @@ static int swrap_bind(int s, const struct sockaddr 
*myaddr, socklen_t addrlen)
        }
 #endif
 
-       si->myname.sa_socklen = addrlen;
-       memcpy(&si->myname.sa.ss, myaddr, addrlen);
+       swrap_address_ip_only_from_sockaddr(&si->myname, myaddr, addrlen);
 
        ret = sockaddr_convert_to_un(si,
                                     myaddr,
                                     addrlen,
                                     &un_addr.sa.un,
                                     1,
-                                    &si->bcast);
+                                    &bcast);
        if (ret == -1) {
                ret_errno = errno;
                goto out;
        }
 
+       si->bcast = bcast;
+
        unlink(un_addr.sa.un.sun_path);
 
        ret = libc_bind(s, &un_addr.sa.s, un_addr.sa_socklen);
@@ -4883,20 +5064,19 @@ static int swrap_getpeername(int s, struct sockaddr 
*name, socklen_t *addrlen)
 
        SWRAP_LOCK_SI(si);
 
-       if (si->peername.sa_socklen == 0)
-       {
+       if (swrap_address_ip_only_len(&si->peername) == 0) {
                errno = ENOTCONN;
                goto out;
        }
 
-       len = MIN(*addrlen, si->peername.sa_socklen);
+       len = MIN(*addrlen, swrap_address_ip_only_len(&si->peername));
        if (len == 0) {
                ret = 0;
                goto out;
        }
 
-       memcpy(name, &si->peername.sa.ss, len);
-       *addrlen = si->peername.sa_socklen;
+       memcpy(name, &si->peername.sa.s, len);
+       *addrlen = swrap_address_ip_only_len(&si->peername);
 
        ret = 0;
 out:
@@ -4930,14 +5110,14 @@ static int swrap_getsockname(int s, struct sockaddr 
*name, socklen_t *addrlen)


-- 
Socket Wrapper Repository

Reply via email to