[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