[SCM] Socket Wrapper Repository - branch master updated

Andreas Schneider asn at samba.org
Wed Dec 11 08:27:59 MST 2013


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 <jhrozek at redhat.com>
Date:   Wed Dec 11 15:03:32 2013 +0100

    Fix formatting of variables of type pid_t

commit 20467324a5508d8efafb087faf1914c87529f052
Author: Jakub Hrozek <jhrozek at redhat.com>
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 <jhrozek at redhat.com>
Date:   Tue Dec 10 16:13:20 2013 +0100

    logging: log creating the sockets

commit f6e30ff7e990c6fcef205602388149ce6de9da93
Author: Jakub Hrozek <jhrozek at redhat.com>
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 <jhrozek at redhat.com>
Date:   Tue Dec 10 15:29:13 2013 +0100

    cmake: Detect attribute format

commit ddcd744708f11d52c28400f3ff22c52b7ebc52b5
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Dec 11 13:03:35 2013 +0100

    tests: Also check recvfrom() with NULL pointer.

commit 6419e8f9a1f09017964ebbb1fb971083bd876e48
Author: Andreas Schneider <asn at samba.org>
Date:   Wed Dec 11 12:56:21 2013 +0100

    tests: Check the returned ip from recvfrom.

commit 63c9d85b6bb13f5e1649323980bc0f3f94b8ee40
Author: Andreas Schneider <asn at samba.org>
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


More information about the samba-cvs mailing list