The branch, master has been updated
       via  c01846d Fix formatting of variables of type pid_t
       via  2046732 tests: use discard_const to get rid of a warning on Solaris
       via  11146ca logging: log creating the sockets
       via  f6e30ff logging: Add logging when loading system functions
       via  46e034b cmake: Detect attribute format
       via  ddcd744 tests: Also check recvfrom() with NULL pointer.
       via  6419e8f tests: Check the returned ip from recvfrom.
       via  63c9d85 tests: Fix passing uninitialized values.
      from  76c7df9 tests: Add test_sendto_recvfrom_ipv6().

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


- Log -----------------------------------------------------------------
commit c01846db2d31b2125d0b1e6bcfc4c38de345d52a
Author: Jakub Hrozek <[email protected]>
Date:   Wed Dec 11 15:03:32 2013 +0100

    Fix formatting of variables of type pid_t

commit 20467324a5508d8efafb087faf1914c87529f052
Author: Jakub Hrozek <[email protected]>
Date:   Wed Dec 11 14:17:02 2013 +0100

    tests: use discard_const to get rid of a warning on Solaris

commit 11146ca50aa4f2ae55d0a61f3d7dae92c8bca63f
Author: Jakub Hrozek <[email protected]>
Date:   Tue Dec 10 16:13:20 2013 +0100

    logging: log creating the sockets

commit f6e30ff7e990c6fcef205602388149ce6de9da93
Author: Jakub Hrozek <[email protected]>
Date:   Tue Dec 10 15:44:27 2013 +0100

    logging: Add logging when loading system functions
    
    Also fix some whitespace errors

commit 46e034bb06093990fe885f8dbdef825bc0eb39e3
Author: Jakub Hrozek <[email protected]>
Date:   Tue Dec 10 15:29:13 2013 +0100

    cmake: Detect attribute format

commit ddcd744708f11d52c28400f3ff22c52b7ebc52b5
Author: Andreas Schneider <[email protected]>
Date:   Wed Dec 11 13:03:35 2013 +0100

    tests: Also check recvfrom() with NULL pointer.

commit 6419e8f9a1f09017964ebbb1fb971083bd876e48
Author: Andreas Schneider <[email protected]>
Date:   Wed Dec 11 12:56:21 2013 +0100

    tests: Check the returned ip from recvfrom.

commit 63c9d85b6bb13f5e1649323980bc0f3f94b8ee40
Author: Andreas Schneider <[email protected]>
Date:   Wed Dec 11 12:03:47 2013 +0100

    tests: Fix passing uninitialized values.

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

Summary of changes:
 ConfigureChecks.cmake                 |   10 ++++
 config.h.cmake                        |    3 +
 src/socket_wrapper.c                  |   73 ++++++++++++++++++++++++++++----
 tests/echo_srv.c                      |   22 +++++++---
 tests/test_echo_udp_sendto_recvfrom.c |   75 +++++++++++++++++++++++++++-----
 tests/torture.h                       |    4 +-
 6 files changed, 158 insertions(+), 29 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
index dd3fdb8..995f8ce 100644
--- a/ConfigureChecks.cmake
+++ b/ConfigureChecks.cmake
@@ -169,6 +169,14 @@ int main(void) {
     return 0;
 }" HAVE_GCC_THREAD_LOCAL_STORAGE)
 
+check_c_source_compiles("
+void log_fn(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
+
+int main(void) {
+    return 0;
+}" HAVE_FUNCTION_ATTRIBUTE_FORMAT)
+
+
 check_library_exists(dl dlopen "" HAVE_LIBDL)
 if (HAVE_LIBDL)
     find_library(DLFCN_LIBRARY dl)
@@ -184,4 +192,6 @@ if (NOT WIN32)
     test_big_endian(WORDS_BIGENDIAN)
 endif (NOT WIN32)
 
+check_type_size(pid_t SIZEOF_PID_T)
+
 set(SWRAP_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} CACHE INTERNAL "swrap 
required system libraries")
diff --git a/config.h.cmake b/config.h.cmake
index 3def5e7..4f912bd 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -29,6 +29,8 @@
 #cmakedefine HAVE_GETTIMEOFDAY_TZ 1
 #cmakedefine HAVE_GETTIMEOFDAY_TZ_VOID 1
 
+/*************************** DATA TYPES***************************/
+#cmakedefine SIZEOF_PID_T @SIZEOF_PID_T@
 
 /**************************** OPTIONS ****************************/
 
@@ -36,6 +38,7 @@
 #cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1
 #cmakedefine HAVE_SOCKADDR_STORAGE 1
 #cmakedefine HAVE_IPV6 1
+#cmakedefine HAVE_FUNCTION_ATTRIBUTE_FORMAT 1
 
 #cmakedefine HAVE_APPLE 1
 #cmakedefine HAVE_LIBSOCKET 1
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index 4964ec1..addcc17 100644
--- a/src/socket_wrapper.c
+++ b/src/socket_wrapper.c
@@ -73,11 +73,11 @@ enum swrap_dbglvl_e {
 };
 
 /* GCC have printf type attribute check. */
-#ifdef __GNUC__
+#ifdef HAVE_FUNCTION_ATTRIBUTE_FORMAT
 #define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b)))
 #else
 #define PRINTF_ATTRIBUTE(a,b)
-#endif /* __GNUC__ */
+#endif /* HAVE_FUNCTION_ATTRIBUTE_FORMAT */
 
 #ifdef HAVE_DESTRUCTOR_ATTRIBUTE
 #define DESTRUCTOR_ATTRIBUTE __attribute__ ((destructor))
@@ -95,6 +95,14 @@ enum swrap_dbglvl_e {
 #define MIN(a,b) ((a)<(b)?(a):(b))
 #endif
 
+#if SIZEOF_PID_T == 8
+# define SPRIpid PRIu64
+#elif SIZEOF_UID_T == 4
+# define SPRIpid PRIu32
+#else
+# define SPRIpid "%d"      /* Sane default for most platforms */
+#endif /* SIZEOF_UID_T */
+
 #ifndef ZERO_STRUCT
 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
 #endif
@@ -146,8 +154,8 @@ enum swrap_dbglvl_e {
 
 /* we need to use a very terse format here as IRIX 6.4 silently
    truncates names to 16 chars, so if we use a longer name then we
-   can't tell which port a packet came from with recvfrom() 
-   
+   can't tell which port a packet came from with recvfrom()
+
    with this format we have 8 chars left for the directory name
 */
 #define SOCKET_FORMAT "%c%02X%04X"
@@ -241,22 +249,22 @@ static void swrap_log(enum swrap_dbglvl_e dbglvl, const 
char *format, ...)
                switch (dbglvl) {
                        case SWRAP_LOG_ERROR:
                                fprintf(stderr,
-                                       "SWRAP_ERROR(%d): %s\n",
+                                       "SWRAP_ERROR("SPRIpid"): %s\n",
                                        getpid(), buffer);
                                break;
                        case SWRAP_LOG_WARN:
                                fprintf(stderr,
-                                       "SWRAP_WARN(%d): %s\n",
+                                       "SWRAP_WARN("SPRIpid"): %s\n",
                                        getpid(), buffer);
                                break;
                        case SWRAP_LOG_DEBUG:
                                fprintf(stderr,
-                                       "SWRAP_DEBUG(%d): %s\n",
+                                       "SWRAP_DEBUG("SPRIpid"): %s\n",
                                        getpid(), buffer);
                                break;
                        case SWRAP_LOG_TRACE:
                                fprintf(stderr,
-                                       "SWRAP_TRACE(%d): %s\n",
+                                       "SWRAP_TRACE("SPRIpid"): %s\n",
                                        getpid(), buffer);
                                break;
                }
@@ -347,6 +355,21 @@ enum swrap_lib {
     SWRAP_LIBSOCKET,
 };
 
+static const char *swrap_str_lib(enum swrap_lib lib)
+{
+       switch (lib) {
+       case SWRAP_LIBC:
+               return "libc";
+       case SWRAP_LIBNSL:
+               return "libnsl";
+       case SWRAP_LIBSOCKET:
+               return "libsocket";
+       }
+
+       /* Compiler would warn us about unhandled enum value if we get here */
+       return "unknown";
+}
+
 static void *swrap_load_lib_handle(enum swrap_lib lib)
 {
        int flags = RTLD_LAZY;
@@ -422,6 +445,9 @@ static void *_swrap_load_lib_function(enum swrap_lib lib, 
const char *fn_name)
                exit(-1);
        }
 
+       SWRAP_LOG(SWRAP_LOG_TRACE,
+                       "Loaded %s from %s",
+                       fn_name, swrap_str_lib(lib));
        return func;
 }
 
@@ -699,6 +725,8 @@ static const char *socket_wrapper_dir(void)
        if (strncmp(s, "./", 2) == 0) {
                s += 2;
        }
+
+       SWRAP_LOG(SWRAP_LOG_TRACE, "socket_wrapper_dir: %s", s);
        return s;
 }
 
@@ -732,6 +760,9 @@ static int convert_un_in(const struct sockaddr_un *un, 
struct sockaddr *in, sock
                return -1;
        }
 
+       SWRAP_LOG(SWRAP_LOG_TRACE, "type %c iface %u port %u",
+                       type, iface, prt);
+
        if (iface == 0 || iface > MAX_WRAPPED_INTERFACES) {
                errno = EINVAL;
                return -1;
@@ -816,6 +847,10 @@ static int convert_in_un_remote(struct socket_info *si, 
const struct sockaddr *i
                        a_type = SOCKET_TYPE_CHAR_UDP;
                        b_type = SOCKET_TYPE_CHAR_UDP;
                        break;
+               default:
+                       SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown socket type!\n");
+                       errno = ESOCKTNOSUPPORT;
+                       return -1;
                }
 
                prt = ntohs(in->sin_port);
@@ -854,6 +889,10 @@ static int convert_in_un_remote(struct socket_info *si, 
const struct sockaddr *i
                case SOCK_DGRAM:
                        type = SOCKET_TYPE_CHAR_UDP_V6;
                        break;
+               default:
+                       SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown socket type!\n");
+                       errno = ESOCKTNOSUPPORT;
+                       return -1;
                }
 
                /* XXX no multicast/broadcast */
@@ -874,11 +913,13 @@ static int convert_in_un_remote(struct socket_info *si, 
const struct sockaddr *i
        }
 #endif
        default:
+               SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown address family!\n");
                errno = ENETUNREACH;
                return -1;
        }
 
        if (prt == 0) {
+               SWRAP_LOG(SWRAP_LOG_WARN, "Port not set\n");
                errno = EINVAL;
                return -1;
        }
@@ -886,12 +927,14 @@ static int convert_in_un_remote(struct socket_info *si, 
const struct sockaddr *i
        if (is_bcast) {
                snprintf(un->sun_path, sizeof(un->sun_path), "%s/EINVAL", 
                         socket_wrapper_dir());
+               SWRAP_LOG(SWRAP_LOG_DEBUG, "un path [%s]", un->sun_path);
                /* the caller need to do more processing */
                return 0;
        }
 
        snprintf(un->sun_path, sizeof(un->sun_path), "%s/"SOCKET_FORMAT, 
                 socket_wrapper_dir(), type, iface, prt);
+       SWRAP_LOG(SWRAP_LOG_DEBUG, "un path [%s]", un->sun_path);
 
        return 0;
 }
@@ -930,6 +973,10 @@ static int convert_in_un_alloc(struct socket_info *si, 
const struct sockaddr *in
                        a_type = SOCKET_TYPE_CHAR_UDP;
                        b_type = SOCKET_TYPE_CHAR_UDP;
                        break;
+               default:
+                       SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown socket type!\n");
+                       errno = ESOCKTNOSUPPORT;
+                       return -1;
                }
 
                if (addr == 0) {
@@ -971,6 +1018,10 @@ static int convert_in_un_alloc(struct socket_info *si, 
const struct sockaddr *in
                case SOCK_DGRAM:
                        type = SOCKET_TYPE_CHAR_UDP_V6;
                        break;
+               default:
+                       SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown socket type!\n");
+                       errno = ESOCKTNOSUPPORT;
+                       return -1;
                }
 
                /* XXX no multicast/broadcast */
@@ -993,6 +1044,7 @@ static int convert_in_un_alloc(struct socket_info *si, 
const struct sockaddr *in
        }
 #endif
        default:
+               SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown address family\n");
                errno = EADDRNOTAVAIL;
                return -1;
        }
@@ -1023,6 +1075,7 @@ static int convert_in_un_alloc(struct socket_info *si, 
const struct sockaddr *in
 
        snprintf(un->sun_path, sizeof(un->sun_path), "%s/"SOCKET_FORMAT, 
                 socket_wrapper_dir(), type, iface, prt);
+       SWRAP_LOG(SWRAP_LOG_DEBUG, "un path [%s]", un->sun_path);
        return 0;
 }
 
@@ -1072,6 +1125,7 @@ static int sockaddr_convert_to_un(struct socket_info *si,
                case SOCK_DGRAM:
                        break;
                default:
+                       SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown socket type!\n");
                        errno = ESOCKTNOSUPPORT;
                        return -1;
                }
@@ -1085,6 +1139,7 @@ static int sockaddr_convert_to_un(struct socket_info *si,
        }
 
        errno = EAFNOSUPPORT;
+       SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown address family\n");
        return -1;
 }
 
@@ -1115,6 +1170,7 @@ static int sockaddr_convert_from_un(const struct 
socket_info *si,
                case SOCK_DGRAM:
                        break;
                default:
+                       SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown socket type!\n");
                        errno = ESOCKTNOSUPPORT;
                        return -1;
                }
@@ -1127,6 +1183,7 @@ static int sockaddr_convert_from_un(const struct 
socket_info *si,
                break;
        }
 
+       SWRAP_LOG(SWRAP_LOG_ERROR, "Unknown address family\n");
        errno = EAFNOSUPPORT;
        return -1;
 }
diff --git a/tests/echo_srv.c b/tests/echo_srv.c
index 32a03da..b290ca8 100644
--- a/tests/echo_srv.c
+++ b/tests/echo_srv.c
@@ -25,6 +25,14 @@
 #define BUFSIZE     4194304
 #endif /* BUFSIZE */
 
+#ifndef discard_const
+#define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
+#endif
+
+#ifndef discard_const_p
+#define discard_const_p(type, ptr) ((type *)discard_const(ptr))
+#endif
+
 struct echo_srv_opts {
     int port;
     int socktype;
@@ -257,13 +265,13 @@ int main(int argc, char **argv)
     int opt;
     int optindex;
     static struct option long_options[] = {
-        {"tcp",         no_argument, 0,  't' },
-        {"udp",         no_argument, 0,  'u' },
-        {"bind-addr",   required_argument, 0,  'b' },
-        {"port",        required_argument, 0,  'p' },
-        {"daemon",      no_argument, 0,  'D' },
-        {"pid",         required_argument, 0,  0 },
-        {0,             0,                 0,  0 }
+        { discard_const_p(char, "tcp"),         no_argument,           0,  't' 
},
+        { discard_const_p(char, "udp"),         no_argument,           0,  'u' 
},
+        { discard_const_p(char, "bind-addr"),   required_argument,     0,  'b' 
},
+        { discard_const_p(char, "port"),        required_argument,     0,  'p' 
},
+        { discard_const_p(char, "daemon"),      no_argument,           0,  'D' 
},
+        { discard_const_p(char, "pid"),         required_argument,     0,  0 },
+        {0,             0,                                             0,  0 }
     };
 
     opts.port = DFL_PORT;
diff --git a/tests/test_echo_udp_sendto_recvfrom.c 
b/tests/test_echo_udp_sendto_recvfrom.c
index 7139656..4852766 100644
--- a/tests/test_echo_udp_sendto_recvfrom.c
+++ b/tests/test_echo_udp_sendto_recvfrom.c
@@ -13,6 +13,7 @@
 #include <arpa/inet.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <unistd.h>
 
 static void setup_echo_srv_udp_ipv4(void **state)
 {
@@ -33,6 +34,8 @@ static void test_sendto_recvfrom_ipv4(void **state)
 {
        struct sockaddr_in sin;
        socklen_t slen = sizeof(struct sockaddr_in);
+       char send_buf[64] = {0};
+       char recv_buf[64] = {0};
        ssize_t ret;
        int rc;
        int i;
@@ -51,10 +54,10 @@ static void test_sendto_recvfrom_ipv4(void **state)
        assert_int_equal(rc, 1);
 
        for (i = 0; i < 10; i++) {
-               char send_buf[64] = {0};
-               char recv_buf[64] = {0};
-               struct sockaddr_in cli_in;
-               socklen_t clen;
+               char ip[INET_ADDRSTRLEN] = {0};
+               const char *a;
+               struct sockaddr_in srv_in;
+               socklen_t rlen = sizeof(srv_in);
 
                snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
 
@@ -70,11 +73,34 @@ static void test_sendto_recvfrom_ipv4(void **state)
                               recv_buf,
                               sizeof(recv_buf),
                               0,
-                              (struct sockaddr *)&cli_in,
-                              &clen);
+                              (struct sockaddr *)&srv_in,
+                              &rlen);
+               assert_int_not_equal(ret, -1);
+
+               a = inet_ntop(AF_INET, &srv_in.sin_addr, ip, sizeof(ip));
+               assert_non_null(a);
+               assert_string_equal(a, TORTURE_ECHO_SRV_IPV4);
 
                assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
        }
+
+       ret = sendto(s,
+                    send_buf,
+                    sizeof(send_buf),
+                    0,
+                    (struct sockaddr *)(void *)&sin,
+                    slen);
+       assert_int_not_equal(ret, -1);
+
+       ret = recvfrom(s,
+                      recv_buf,
+                      sizeof(recv_buf),
+                      0,
+                      NULL,
+                      NULL);
+       assert_int_not_equal(ret, -1);
+
+       close(s);
 }
 
 #ifdef HAVE_IPV6
@@ -82,6 +108,8 @@ static void test_sendto_recvfrom_ipv6(void **state)
 {
        struct sockaddr_in6 sin6;
        socklen_t slen = sizeof(struct sockaddr_in6);
+       char send_buf[64] = {0};
+       char recv_buf[64] = {0};
        ssize_t ret;
        int rc;
        int i;
@@ -100,10 +128,10 @@ static void test_sendto_recvfrom_ipv6(void **state)
        assert_int_equal(rc, 1);
 
        for (i = 0; i < 10; i++) {
-               char send_buf[64] = {0};
-               char recv_buf[64] = {0};
-               struct sockaddr_in6 cli_in6;
-               socklen_t clen;
+               char ip[INET6_ADDRSTRLEN] = {0};
+               const char *a;
+               struct sockaddr_in6 srv_in6;
+               socklen_t rlen = sizeof(srv_in6);
 
                snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
 
@@ -119,11 +147,34 @@ static void test_sendto_recvfrom_ipv6(void **state)
                               recv_buf,
                               sizeof(recv_buf),
                               0,
-                              (struct sockaddr *)&cli_in6,
-                              &clen);
+                              (struct sockaddr *)&srv_in6,
+                              &rlen);
+               assert_int_not_equal(ret, -1);
+
+               a = inet_ntop(AF_INET6, &srv_in6.sin6_addr, ip, sizeof(ip));
+               assert_non_null(a);
+               assert_string_equal(a, TORTURE_ECHO_SRV_IPV6);
 
                assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
        }
+
+       ret = sendto(s,
+                    send_buf,
+                    sizeof(send_buf),
+                    0,
+                    (struct sockaddr *)(void *)&sin6,
+                    slen);
+       assert_int_not_equal(ret, -1);
+
+       ret = recvfrom(s,
+                      recv_buf,
+                      sizeof(recv_buf),
+                      0,
+                      NULL,
+                      NULL);
+       assert_int_not_equal(ret, -1);
+
+       close(s);
 }
 #endif
 
diff --git a/tests/torture.h b/tests/torture.h
index be2556f..7b88a4c 100644
--- a/tests/torture.h
+++ b/tests/torture.h
@@ -44,8 +44,8 @@
 #include <string.h>
 
 #define TORTURE_ECHO_SRV_IPV4 "127.0.0.10"
-/* socket wrapper IPv6 prefix  FD00::5357:5Fxx */
-#define TORTURE_ECHO_SRV_IPV6 "FD00::5357:5F10"
+/* socket wrapper IPv6 prefix  fd00::5357:5fxx */
+#define TORTURE_ECHO_SRV_IPV6 "fd00::5357:5f10"
 #define TORTURE_ECHO_SRV_PORT 7
 
 struct torture_state {


-- 
Socket Wrapper Repository

Reply via email to