summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/test_echo_tcp_bind.c163
-rw-r--r--tests/test_echo_tcp_connect.c30
-rw-r--r--tests/test_echo_tcp_get_peer_sock_name.c370
-rw-r--r--tests/test_echo_tcp_socket.c20
-rw-r--r--tests/test_echo_tcp_socket_options.c48
-rw-r--r--tests/test_echo_tcp_write_read.c30
-rw-r--r--tests/test_echo_tcp_writev_readv.c32
-rw-r--r--tests/test_echo_udp_send_recv.c28
-rw-r--r--tests/test_echo_udp_sendmsg_recvmsg.c54
-rw-r--r--tests/test_echo_udp_sendto_recvfrom.c62
-rw-r--r--tests/torture.h17
12 files changed, 477 insertions, 378 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 17b1212..84063a7 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -3,6 +3,7 @@ project(tests C)
include_directories(
${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_SOURCE_DIR}/src
${CMOCKA_INCLUDE_DIR}
)
diff --git a/tests/test_echo_tcp_bind.c b/tests/test_echo_tcp_bind.c
index c159206..705fd8d 100644
--- a/tests/test_echo_tcp_bind.c
+++ b/tests/test_echo_tcp_bind.c
@@ -36,12 +36,15 @@ static void teardown(void **state)
static void test_bind_ipv4(void **state)
{
- struct sockaddr sa;
- socklen_t salen = sizeof(struct sockaddr);
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
- struct sockaddr_un addr_un;
- socklen_t sulen = sizeof(struct sockaddr_un);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+ struct torture_address addr_in = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
+ struct torture_address addr_un = {
+ .sa_socklen = sizeof(struct sockaddr_un),
+ };
int rc;
int s;
@@ -56,34 +59,34 @@ static void test_bind_ipv4(void **state)
/* UNSPEC, len == 1: EINVAL */
- sin = (struct sockaddr_in) {
+ addr_in.sa.in = (struct sockaddr_in) {
.sin_family = AF_UNSPEC,
};
- rc = bind(s, (struct sockaddr *)&sin, 1);
+ rc = bind(s, &addr.sa.s, 1);
assert_int_equal(rc, -1);
assert_int_equal(errno, EINVAL);
/* UNSPEC: EAFNOSUPPORT */
- sin = (struct sockaddr_in) {
+ addr_in.sa.in = (struct sockaddr_in) {
.sin_family = AF_UNSPEC,
};
- rc = inet_pton(AF_INET, "127.0.0.20", &sin.sin_addr);
+ rc = inet_pton(AF_INET, "127.0.0.20", &addr_in.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr_in.sa.s, addr_in.sa_socklen);
assert_int_equal(rc, -1);
/* FreeBSD uses EADDRNOTAVAIL here ... */
assert_true(errno == EAFNOSUPPORT || errno == EADDRNOTAVAIL);
/* special case: AF_UNSPEC with INADDR_ANY: success mapped to AF_INET */
- sin = (struct sockaddr_in) {
+ addr_in.sa.in = (struct sockaddr_in) {
.sin_family = AF_UNSPEC,
};
- assert_int_equal(sin.sin_addr.s_addr, htonl(INADDR_ANY));
+ assert_int_equal(addr_in.sa.in.sin_addr.s_addr, htonl(INADDR_ANY));
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr_in.sa.s, addr_in.sa_socklen);
assert_return_code(rc, errno);
close(s);
@@ -96,24 +99,24 @@ static void test_bind_ipv4(void **state)
* all fail with EAFNOSUPPORT
*/
- sa = (struct sockaddr) {
- .sa_family = AF_UNIX,
+ addr.sa.ss = (struct sockaddr_storage) {
+ .ss_family = AF_UNIX,
};
- rc = bind(s, (struct sockaddr *)&sa, salen);
+ rc = bind(s, &addr.sa.s, addr.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, EAFNOSUPPORT);
- sin = (struct sockaddr_in) {
+ addr_in.sa.in = (struct sockaddr_in) {
.sin_family = AF_UNIX,
};
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr_in.sa.s, addr_in.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, EAFNOSUPPORT);
- addr_un = (struct sockaddr_un) {
+ addr_un.sa.un = (struct sockaddr_un) {
.sun_family = AF_UNIX,
};
- rc = bind(s, (struct sockaddr *)&addr_un, sulen);
+ rc = bind(s, &addr_un.sa.s, addr_un.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, EAFNOSUPPORT);
@@ -122,10 +125,10 @@ static void test_bind_ipv4(void **state)
* Test with family AF_INET6 - fail
*/
- sin = (struct sockaddr_in) {
+ addr_in.sa.in = (struct sockaddr_in) {
.sin_family = AF_INET6,
};
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr_in.sa.s, addr_in.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, EAFNOSUPPORT);
#endif
@@ -133,22 +136,33 @@ static void test_bind_ipv4(void **state)
/*
* Finally, success binding a new IPv4 address.
*/
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
+ addr_in = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_un),
+ .sa.in = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ },
+ };
- rc = inet_pton(AF_INET, "127.0.0.20", &sin.sin_addr);
+ rc = inet_pton(AF_INET, "127.0.0.20", &addr_in.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr_in.sa.s, addr_in.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
- rc = inet_pton(AF_INET, torture_server_address(AF_INET), &sin.sin_addr);
+ addr_in = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_un),
+ .sa.in = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ .sin_port = htons(torture_server_port()),
+ },
+ };
+
+ rc = inet_pton(AF_INET,
+ torture_server_address(AF_INET),
+ &addr_in.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr_in.sa.s, addr_in.sa_socklen);
assert_return_code(rc, errno);
close(s);
@@ -313,8 +327,9 @@ static void test_bind_ipv4_addr_in_use(void **state)
#ifdef HAVE_BINDRESVPORT
static void test_bindresvport_ipv4(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
int rc;
int s;
@@ -323,22 +338,28 @@ static void test_bindresvport_ipv4(void **state)
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert_return_code(s, errno);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
+ addr.sa.in.sin_family = AF_INET;
- rc = inet_pton(AF_INET, "127.0.0.20", &sin.sin_addr);
+ rc = inet_pton(AF_INET, "127.0.0.20", &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = bindresvport(s, &sin);
+ rc = bindresvport(s, &addr.sa.in);
assert_return_code(rc, errno);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
- rc = inet_pton(AF_INET, torture_server_address(AF_INET), &sin.sin_addr);
+ addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ .sa.in = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ .sin_port = htons(torture_server_port()),
+ },
+ };
+
+ rc = inet_pton(AF_INET,
+ torture_server_address(AF_INET),
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.in, addr.sa_socklen);
assert_return_code(rc, errno);
close(s);
@@ -346,8 +367,9 @@ static void test_bindresvport_ipv4(void **state)
static void test_bindresvport_ipv4_null(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
int rc;
int s;
@@ -359,13 +381,12 @@ static void test_bindresvport_ipv4_null(void **state)
rc = bindresvport(s, NULL);
assert_return_code(rc, errno);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
- rc = inet_pton(AF_INET, torture_server_address(AF_INET), &sin.sin_addr);
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
+ rc = inet_pton(AF_INET, torture_server_address(AF_INET), &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_return_code(rc, errno);
close(s);
@@ -375,12 +396,12 @@ static void test_bindresvport_ipv4_null(void **state)
#ifdef HAVE_IPV6
static void test_bind_on_ipv6_sock(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
- struct sockaddr_in6 sin6;
- socklen_t slen6 = sizeof(struct sockaddr_in6);
- struct sockaddr_un addr_un;
- socklen_t sulen = sizeof(struct sockaddr_un);
+ struct torture_address addr_in = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
+ struct torture_address addr_un = {
+ .sa_socklen = sizeof(struct sockaddr_un),
+ };
int rc;
int s;
@@ -389,32 +410,36 @@ static void test_bind_on_ipv6_sock(void **state)
s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
assert_return_code(s, errno);
- ZERO_STRUCT(addr_un);
- addr_un.sun_family = AF_UNIX;
- rc = bind(s, (struct sockaddr *)&addr_un, sulen);
+ addr_un.sa.un.sun_family = AF_UNIX;
+ rc = bind(s, &addr_un.sa.un, addr_un.sa_socklen);
assert_int_equal(rc, -1);
/* FreeBSD uses EINVAL here... */
assert_true(errno == EAFNOSUPPORT || errno == EINVAL);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ addr_in.sa.in.sin_family = AF_INET;
+ rc = bind(s, &addr_in.sa.s, addr_in.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, EINVAL);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
+ addr_in.sa.in = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ };
- rc = inet_pton(AF_INET, "127.0.0.20", &sin.sin_addr);
+ rc = inet_pton(AF_INET, "127.0.0.20", &addr_in.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr_in.sa.s, addr_in.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, EINVAL);
- ZERO_STRUCT(sin6);
- sin6.sin6_family = AF_INET;
- rc = bind(s, (struct sockaddr *)&sin6, slen6);
+ addr_in = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_in6),
+ .sa.in = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ },
+ };
+
+ rc = bind(s, &addr_in.sa.s, addr_in.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, EAFNOSUPPORT);
diff --git a/tests/test_echo_tcp_connect.c b/tests/test_echo_tcp_connect.c
index b20e453..0697e13 100644
--- a/tests/test_echo_tcp_connect.c
+++ b/tests/test_echo_tcp_connect.c
@@ -27,8 +27,9 @@ static void teardown(void **state)
static void test_connect_broadcast_ipv4(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
int rc;
int s;
@@ -37,13 +38,12 @@ static void test_connect_broadcast_ipv4(void **state)
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
- sin.sin_addr.s_addr = INADDR_BROADCAST;
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
+ addr.sa.in.sin_addr.s_addr = INADDR_BROADCAST;
/* We don't allow connect to broadcast addresses */
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_int_equal(rc, -1);
close(s);
@@ -52,8 +52,9 @@ static void test_connect_broadcast_ipv4(void **state)
#ifdef HAVE_IPV6
static void test_connect_downgrade_ipv6(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
int rc;
int s;
@@ -62,17 +63,16 @@ static void test_connect_downgrade_ipv6(void **state)
s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
- rc = inet_pton(sin.sin_family,
+ rc = inet_pton(addr.sa.in.sin_family,
torture_server_address(AF_INET),
- &sin.sin_addr);
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
/* Connect should downgrade to IPv4 and allow the connect */
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.in, addr.sa_socklen);
assert_int_equal(rc, 0);
close(s);
diff --git a/tests/test_echo_tcp_get_peer_sock_name.c b/tests/test_echo_tcp_get_peer_sock_name.c
index 258ad7c..5f4a9e4 100644
--- a/tests/test_echo_tcp_get_peer_sock_name.c
+++ b/tests/test_echo_tcp_get_peer_sock_name.c
@@ -26,15 +26,16 @@ static void teardown(void **state)
torture_teardown_echo_srv(state);
}
-static void _assert_sockaddr_equal(struct sockaddr_storage *ss, const char *a,
+static void _assert_sockaddr_equal(struct torture_address *addr, const char *a,
const char * const file, const int line)
{
char ip[INET6_ADDRSTRLEN] = { 0 };
- struct sockaddr_in *sinp = (struct sockaddr_in *)ss;
const char *p;
- p = inet_ntop(ss->ss_family,
- &sinp->sin_addr,
+ p = inet_ntop(addr->sa.ss.ss_family,
+ addr->sa.ss.ss_family == AF_INET6 ?
+ (void *)&addr->sa.in6.sin6_addr :
+ (void *)&addr->sa.in.sin_addr,
ip,
sizeof(ip));
_assert_true(cast_ptr_to_largest_integral_type(p),
@@ -46,29 +47,49 @@ static void _assert_sockaddr_equal(struct sockaddr_storage *ss, const char *a,
#define assert_sockaddr_equal(ss, a) \
_assert_sockaddr_equal(ss, a, __FILE__, __LINE__)
-static void _assert_sockaddr_port_equal(struct sockaddr_storage *ss, const char *a,
+static void _assert_sockaddr_port_equal(struct torture_address *addr,
+ const char *a,
uint16_t port,
const char * const file, const int line)
{
- struct sockaddr_in *sinp = (struct sockaddr_in *)ss;
+ uint16_t n_port;
- _assert_sockaddr_equal(ss, a, file, line);
+ _assert_sockaddr_equal(addr, a, file, line);
- _assert_int_equal(ntohs(sinp->sin_port), port, file, line);
+ switch(addr->sa.ss.ss_family) {
+ case AF_INET:
+ n_port = addr->sa.in.sin_port;
+ case AF_INET6:
+ n_port = addr->sa.in6.sin6_port;
+ default:
+ return;
+ }
+
+ _assert_int_equal(ntohs(n_port), port, file, line);
}
#define assert_sockaddr_port_equal(ss, a, prt) \
_assert_sockaddr_port_equal(ss, a, prt, __FILE__, __LINE__)
-static void _assert_sockaddr_port_range_equal(struct sockaddr_storage *ss, const char *a,
+static void _assert_sockaddr_port_range_equal(struct torture_address *addr,
+ const char *a,
uint16_t min_port, uint16_t max_port,
const char * const file, const int line)
{
- struct sockaddr_in *sinp = (struct sockaddr_in *)ss;
+ uint16_t n_port;
+
+ _assert_sockaddr_equal(addr, a, file, line);
- _assert_sockaddr_equal(ss, a, file, line);
+ switch(addr->sa.ss.ss_family) {
+ case AF_INET:
+ n_port = addr->sa.in.sin_port;
+ case AF_INET6:
+ n_port = addr->sa.in6.sin6_port;
+ default:
+ return;
+ }
- _assert_in_range(ntohs(sinp->sin_port),
+ _assert_in_range(ntohs(n_port),
min_port,
max_port,
file,
@@ -80,12 +101,15 @@ static void _assert_sockaddr_port_range_equal(struct sockaddr_storage *ss, const
static void test_connect_getsockname_getpeername(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
- struct sockaddr_storage cli_ss1;
- socklen_t cli_ss1_len;
- struct sockaddr_storage srv_ss1;
- socklen_t srv_ss1_len;
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
+ struct torture_address cli_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+ struct torture_address srv_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
int rc;
int s;
@@ -95,61 +119,69 @@ static void test_connect_getsockname_getpeername(void **state)
assert_return_code(s, errno);
/* Bind client address to wildcard address */
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
+ addr.sa.in.sin_family = AF_INET;
- rc = inet_pton(AF_INET, "127.0.0.20", &sin.sin_addr);
+ rc = inet_pton(AF_INET, "127.0.0.20", &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr.sa.s, addr.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(cli_ss1);
- cli_ss1_len = sizeof(cli_ss1);
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_range_equal(&cli_ss1, "127.0.0.20", 1024, 65535);
+ assert_sockaddr_port_range_equal(&cli_addr, "127.0.0.20", 1024, 65535);
- ZERO_STRUCT(srv_ss1);
- srv_ss1_len = sizeof(srv_ss1);
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ rc = getpeername(s, &addr.sa.s, &addr.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, ENOTCONN);
/* connect */
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
- rc = inet_pton(AF_INET, torture_server_address(AF_INET), &sin.sin_addr);
+ addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ .sa.in = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ .sin_port = htons(torture_server_port()),
+ },
+ };
+ rc = inet_pton(AF_INET,
+ torture_server_address(AF_INET),
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
/* Connect */
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(cli_ss1);
- cli_ss1_len = sizeof(cli_ss1);
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ cli_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_range_equal(&cli_ss1, "127.0.0.20", 1024, 65535);
+ assert_sockaddr_port_range_equal(&cli_addr, "127.0.0.20", 1024, 65535);
+
+ srv_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
- ZERO_STRUCT(srv_ss1);
- srv_ss1_len = sizeof(srv_ss1);
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ rc = getpeername(s, &srv_addr.sa.s, &srv_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_equal(&srv_ss1, "127.0.0.10", 7);
+ assert_sockaddr_port_equal(&srv_addr, "127.0.0.10", 7);
close(s);
}
static void test_connect_getsockname_getpeername_port(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
- struct sockaddr_storage cli_ss1;
- socklen_t cli_ss1_len;
- struct sockaddr_storage srv_ss1;
- socklen_t srv_ss1_len;
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
+ struct torture_address cli_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+ struct torture_address srv_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
int rc;
int s;
@@ -159,62 +191,71 @@ static void test_connect_getsockname_getpeername_port(void **state)
assert_return_code(s, errno);
/* Bind client address to wildcard address */
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
+ addr.sa.in.sin_family = AF_INET;
- rc = inet_pton(AF_INET, "127.0.0.20", &sin.sin_addr);
+ rc = inet_pton(AF_INET, "127.0.0.20", &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- sin.sin_port = htons(12345);
+ addr.sa.in.sin_port = htons(12345);
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr.sa.s, addr.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(cli_ss1);
- cli_ss1_len = sizeof(cli_ss1);
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_equal(&cli_ss1, "127.0.0.20", 12345);
+ assert_sockaddr_port_equal(&cli_addr, "127.0.0.20", 12345);
- ZERO_STRUCT(srv_ss1);
- srv_ss1_len = sizeof(srv_ss1);
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ rc = getpeername(s, &srv_addr.sa.s, &srv_addr.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, ENOTCONN);
/* connect */
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
- rc = inet_pton(AF_INET, torture_server_address(AF_INET), &sin.sin_addr);
+ addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ .sa.in = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ .sin_port = htons(torture_server_port()),
+ },
+ };
+
+ rc = inet_pton(AF_INET,
+ torture_server_address(AF_INET),
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
/* Connect */
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(cli_ss1);
- cli_ss1_len = sizeof(cli_ss1);
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ cli_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_equal(&cli_ss1, "127.0.0.20", 12345);
+ assert_sockaddr_port_equal(&cli_addr, "127.0.0.20", 12345);
- ZERO_STRUCT(srv_ss1);
- srv_ss1_len = sizeof(srv_ss1);
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ srv_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+
+ rc = getpeername(s, &srv_addr.sa.s, &srv_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_equal(&srv_ss1, "127.0.0.10", 7);
+ assert_sockaddr_port_equal(&srv_addr, "127.0.0.10", 7);
close(s);
}
static void test_connect_getsockname_getpeername_any(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
- struct sockaddr_storage cli_ss1;
- socklen_t cli_ss1_len;
- struct sockaddr_storage srv_ss1;
- socklen_t srv_ss1_len;
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
+ struct torture_address cli_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+ struct torture_address srv_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
int rc;
int s;
@@ -224,59 +265,62 @@ static void test_connect_getsockname_getpeername_any(void **state)
assert_return_code(s, errno);
/* Bind client address to wildcard address */
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = htonl(INADDR_ANY);
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_addr.s_addr = htonl(INADDR_ANY);
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr.sa.s, addr.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(cli_ss1);
- cli_ss1_len = sizeof(cli_ss1);
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_range_equal(&cli_ss1, "0.0.0.0", 1024, 65535);
+ assert_sockaddr_port_range_equal(&cli_addr, "0.0.0.0", 1024, 65535);
- ZERO_STRUCT(srv_ss1);
- srv_ss1_len = sizeof(srv_ss1);
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ rc = getpeername(s, &srv_addr.sa.s, &srv_addr.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, ENOTCONN);
/* connect */
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
- rc = inet_pton(AF_INET, torture_server_address(AF_INET), &sin.sin_addr);
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
+ rc = inet_pton(AF_INET,
+ torture_server_address(AF_INET),
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
/* Connect */
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(cli_ss1);
- cli_ss1_len = sizeof(cli_ss1);
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ cli_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_range_equal(&cli_ss1, "127.0.0.20", 1024, 65535);
+ assert_sockaddr_port_range_equal(&cli_addr, "127.0.0.20", 1024, 65535);
+
+ srv_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
- ZERO_STRUCT(srv_ss1);
- srv_ss1_len = sizeof(srv_ss1);
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ rc = getpeername(s, &srv_addr.sa.s, &srv_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_equal(&srv_ss1, "127.0.0.10", 7);
+ assert_sockaddr_port_equal(&srv_addr, "127.0.0.10", 7);
close(s);
}
static void test_connect_getsockname_getpeername_any_port(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
- struct sockaddr_storage cli_ss1;
- socklen_t cli_ss1_len;
- struct sockaddr_storage srv_ss1;
- socklen_t srv_ss1_len;
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
+ struct torture_address cli_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+ struct torture_address srv_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
int rc;
int s;
@@ -286,60 +330,63 @@ static void test_connect_getsockname_getpeername_any_port(void **state)
assert_return_code(s, errno);
/* Bind client address to wildcard address */
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = htonl(INADDR_ANY);
- sin.sin_port = htons(12345);
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_addr.s_addr = htonl(INADDR_ANY);
+ addr.sa.in.sin_port = htons(12345);
- rc = bind(s, (struct sockaddr *)&sin, slen);
+ rc = bind(s, &addr.sa.s, addr.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(cli_ss1);
- cli_ss1_len = sizeof(cli_ss1);
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_equal(&cli_ss1, "0.0.0.0", 12345);
+ assert_sockaddr_port_equal(&cli_addr, "0.0.0.0", 12345);
- ZERO_STRUCT(srv_ss1);
- srv_ss1_len = sizeof(srv_ss1);
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ rc = getpeername(s, &srv_addr.sa.s, &srv_addr.sa_socklen);
assert_int_equal(rc, -1);
assert_int_equal(errno, ENOTCONN);
/* connect */
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
- rc = inet_pton(AF_INET, torture_server_address(AF_INET), &sin.sin_addr);
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
+ rc = inet_pton(AF_INET,
+ torture_server_address(AF_INET),
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
/* Connect */
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(cli_ss1);
- cli_ss1_len = sizeof(cli_ss1);
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ cli_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_equal(&cli_ss1, "127.0.0.20", 12345);
+ assert_sockaddr_port_equal(&cli_addr, "127.0.0.20", 12345);
+
+ srv_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
- ZERO_STRUCT(srv_ss1);
- srv_ss1_len = sizeof(srv_ss1);
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ rc = getpeername(s, &srv_addr.sa.s, &srv_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_sockaddr_port_equal(&srv_ss1, "127.0.0.10", 7);
+ assert_sockaddr_port_equal(&srv_addr, "127.0.0.10", 7);
close(s);
}
static void test_connect_getsockname_getpeername_len(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
- struct sockaddr_storage cli_ss1;
- socklen_t cli_ss1_len;
- struct sockaddr_storage srv_ss1;
- socklen_t srv_ss1_len;
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
+ struct torture_address cli_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
+ struct torture_address srv_addr = {
+ .sa_socklen = sizeof(struct sockaddr_storage),
+ };
socklen_t tmp_len;
int rc;
int s;
@@ -350,39 +397,44 @@ static void test_connect_getsockname_getpeername_len(void **state)
assert_return_code(s, errno);
/* connect */
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
- rc = inet_pton(AF_INET, torture_server_address(AF_INET), &sin.sin_addr);
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
+ rc = inet_pton(AF_INET,
+ torture_server_address(AF_INET),
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
/* Connect */
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.in, addr.sa_socklen);
assert_return_code(rc, errno);
/* Check with len=0 */
- ZERO_STRUCT(cli_ss1);
- cli_ss1_len = 0;
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ cli_addr.sa_socklen = 0;
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- ZERO_STRUCT(srv_ss1);
- srv_ss1_len = 0;
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ srv_addr.sa_socklen = 0;
+ rc = getpeername(s, &srv_addr.sa.s, &srv_addr.sa_socklen);
assert_return_code(rc, errno);
/* Check with len=too small */
- ZERO_STRUCT(cli_ss1);
- tmp_len = cli_ss1_len = sizeof(struct sockaddr_in) - 2;
- rc = getsockname(s, (struct sockaddr *)&cli_ss1, &cli_ss1_len);
+ cli_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_in) - 2,
+ };
+
+ tmp_len = cli_addr.sa_socklen;
+ rc = getsockname(s, &cli_addr.sa.s, &cli_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_int_equal(tmp_len + 2, cli_ss1_len);
+ assert_int_equal(tmp_len + 2, cli_addr.sa_socklen);
+
+ srv_addr = (struct torture_address) {
+ .sa_socklen = sizeof(struct sockaddr_in) - 2,
+ };
- ZERO_STRUCT(srv_ss1);
- tmp_len = srv_ss1_len = sizeof(struct sockaddr_in) - 2;
- rc = getpeername(s, (struct sockaddr *)&srv_ss1, &srv_ss1_len);
+ tmp_len = srv_addr.sa_socklen;
+ rc = getpeername(s, &srv_addr.sa.s, &srv_addr.sa_socklen);
assert_return_code(rc, errno);
- assert_int_equal(tmp_len + 2, srv_ss1_len);
+ assert_int_equal(tmp_len + 2, srv_addr.sa_socklen);
close(s);
}
diff --git a/tests/test_echo_tcp_socket.c b/tests/test_echo_tcp_socket.c
index 04f15aa..ebbe87b 100644
--- a/tests/test_echo_tcp_socket.c
+++ b/tests/test_echo_tcp_socket.c
@@ -17,8 +17,9 @@
static void test_socket_getsockname(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
int rc;
int s;
@@ -27,17 +28,17 @@ static void test_socket_getsockname(void **state)
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- rc = getsockname(s, (struct sockaddr *)&sin, &slen);
+ rc = getsockname(s, &addr.sa.in, &addr.sa_socklen);
assert_return_code(rc, errno);
- assert_int_equal(sin.sin_family, AF_INET);
+ assert_int_equal(addr.sa.in.sin_family, AF_INET);
}
#ifdef HAVE_IPV6
static void test_socket_getsockname6(void **state)
{
- struct sockaddr_in6 sin6;
- socklen_t slen = sizeof(struct sockaddr_in6);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
int rc;
int s;
@@ -46,10 +47,9 @@ static void test_socket_getsockname6(void **state)
s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin6);
- rc = getsockname(s, (struct sockaddr *)&sin6, &slen);
+ rc = getsockname(s, &addr.sa.in6, &addr.sa_socklen);
assert_return_code(rc, errno);
- assert_int_equal(sin6.sin6_family, AF_INET6);
+ assert_int_equal(addr.sa.in6.sin6_family, AF_INET6);
}
#endif
diff --git a/tests/test_echo_tcp_socket_options.c b/tests/test_echo_tcp_socket_options.c
index 3da4a95..ba14e73 100644
--- a/tests/test_echo_tcp_socket_options.c
+++ b/tests/test_echo_tcp_socket_options.c
@@ -44,8 +44,9 @@ static void teardown(void **state)
static void test_sockopt_sndbuf(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
int obufsize = 0;
socklen_t olen = sizeof(obufsize);
int gbufsize = 0;
@@ -59,16 +60,15 @@ static void test_sockopt_sndbuf(void **state)
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
- rc = inet_pton(sin.sin_family,
+ rc = inet_pton(addr.sa.in.sin_family,
torture_server_address(AF_INET),
- &sin.sin_addr);
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_int_equal(rc, 0);
rc = getsockopt(s, SOL_SOCKET, SO_SNDBUF, &obufsize, &olen);
@@ -95,8 +95,9 @@ static void test_sockopt_sndbuf(void **state)
static void test_sockopt_so(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
socklen_t so_len;
#ifdef SO_DOMAIN
int so_domain = -1;
@@ -113,16 +114,15 @@ static void test_sockopt_so(void **state)
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
- rc = inet_pton(sin.sin_family,
+ rc = inet_pton(addr.sa.in.sin_family,
torture_server_address(AF_INET),
- &sin.sin_addr);
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.in, addr.sa_socklen);
assert_int_equal(rc, 0);
#ifdef SO_DOMAIN
@@ -165,8 +165,9 @@ static void test_sockopt_so(void **state)
#ifdef HAVE_IPV6
static void test_sockopt_so6(void **state)
{
- struct sockaddr_in6 sin6;
- socklen_t slen = sizeof(struct sockaddr_in6);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
#ifdef SO_DOMAIN
int so_domain = -1;
#endif /* SO_DOMAIN */
@@ -183,16 +184,15 @@ static void test_sockopt_so6(void **state)
s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin6);
- sin6.sin6_family = AF_INET6;
- sin6.sin6_port = htons(torture_server_port());
+ addr.sa.in6.sin6_family = AF_INET6;
+ addr.sa.in6.sin6_port = htons(torture_server_port());
- rc = inet_pton(sin6.sin6_family,
+ rc = inet_pton(addr.sa.in6.sin6_family,
torture_server_address(AF_INET6),
- &sin6.sin6_addr);
+ &addr.sa.in6.sin6_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin6, slen);
+ rc = connect(s, &addr.sa.in6, addr.sa_socklen);
assert_int_equal(rc, 0);
#ifdef SO_DOMAIN
diff --git a/tests/test_echo_tcp_write_read.c b/tests/test_echo_tcp_write_read.c
index 4437de9..80200ad 100644
--- a/tests/test_echo_tcp_write_read.c
+++ b/tests/test_echo_tcp_write_read.c
@@ -34,8 +34,9 @@ static void teardown(void **state)
static void test_write_read_ipv4(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
ssize_t ret;
int rc;
int i;
@@ -46,16 +47,15 @@ static void test_write_read_ipv4(void **state)
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
- rc = inet_pton(sin.sin_family,
+ rc = inet_pton(addr.sa.in.sin_family,
torture_server_address(AF_INET),
- &sin.sin_addr);
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_int_equal(rc, 0);
for (i = 0; i < 10; i++) {
@@ -83,8 +83,9 @@ static void test_write_read_ipv4(void **state)
#ifdef HAVE_IPV6
static void test_write_read_ipv6(void **state)
{
- struct sockaddr_in6 sin6;
- socklen_t slen = sizeof(struct sockaddr_in6);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in6),
+ };
ssize_t ret;
int rc;
int i;
@@ -95,16 +96,15 @@ static void test_write_read_ipv6(void **state)
s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin6);
- sin6.sin6_family = AF_INET6;
- sin6.sin6_port = htons(torture_server_port());
+ addr.sa.in6.sin6_family = AF_INET6;
+ addr.sa.in6.sin6_port = htons(torture_server_port());
rc = inet_pton(AF_INET6,
torture_server_address(AF_INET6),
- &sin6.sin6_addr);
+ &addr.sa.in6.sin6_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin6, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_int_equal(rc, 0);
for (i = 0; i < 10; i++) {
diff --git a/tests/test_echo_tcp_writev_readv.c b/tests/test_echo_tcp_writev_readv.c
index c7b8dd9..7a8b436 100644
--- a/tests/test_echo_tcp_writev_readv.c
+++ b/tests/test_echo_tcp_writev_readv.c
@@ -35,8 +35,9 @@ static void teardown(void **state)
static void test_writev_readv_ipv4(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
ssize_t ret;
int rc;
int i;
@@ -47,16 +48,15 @@ static void test_writev_readv_ipv4(void **state)
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
- rc = inet_pton(sin.sin_family,
+ rc = inet_pton(addr.sa.in.sin_family,
torture_server_address(AF_INET),
- &sin.sin_addr);
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_int_equal(rc, 0);
for (i = 1; i < 10; i++) {
@@ -100,8 +100,9 @@ static void test_writev_readv_ipv4(void **state)
#ifdef HAVE_IPV6
static void test_writev_readv_ipv6(void **state)
{
- struct sockaddr_in6 sin6;
- socklen_t slen = sizeof(struct sockaddr_in6);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in6),
+ };
ssize_t ret;
int rc;
int i;
@@ -112,16 +113,15 @@ static void test_writev_readv_ipv6(void **state)
s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin6);
- sin6.sin6_family = AF_INET6;
- sin6.sin6_port = htons(torture_server_port());
+ addr.sa.in6.sin6_family = AF_INET6;
+ addr.sa.in6.sin6_port = htons(torture_server_port());
rc = inet_pton(AF_INET6,
- torture_server_address(AF_INET6),
- &sin6.sin6_addr);
+ torture_server_address(AF_INET6),
+ &addr.sa.in6.sin6_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin6, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_int_equal(rc, 0);
for (i = 1; i < 10; i++) {
diff --git a/tests/test_echo_udp_send_recv.c b/tests/test_echo_udp_send_recv.c
index 9dd208b..435d1b9 100644
--- a/tests/test_echo_udp_send_recv.c
+++ b/tests/test_echo_udp_send_recv.c
@@ -34,8 +34,9 @@ static void teardown(void **state)
static void test_send_recv_ipv4(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
ssize_t ret;
int rc;
int i;
@@ -46,16 +47,15 @@ static void test_send_recv_ipv4(void **state)
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
rc = inet_pton(AF_INET,
torture_server_address(AF_INET),
- &sin.sin_addr);
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_int_equal(rc, 0);
for (i = 0; i < 10; i++) {
@@ -85,8 +85,9 @@ static void test_send_recv_ipv4(void **state)
#ifdef HAVE_IPV6
static void test_send_recv_ipv6(void **state)
{
- struct sockaddr_in6 sin6;
- socklen_t slen = sizeof(struct sockaddr_in6);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in6),
+ };
ssize_t ret;
int rc;
int i;
@@ -97,16 +98,15 @@ static void test_send_recv_ipv6(void **state)
s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin6);
- sin6.sin6_family = AF_INET6;
- sin6.sin6_port = htons(torture_server_port());
+ addr.sa.in6.sin6_family = AF_INET6;
+ addr.sa.in6.sin6_port = htons(torture_server_port());
rc = inet_pton(AF_INET6,
torture_server_address(AF_INET6),
- &sin6.sin6_addr);
+ &addr.sa.in6.sin6_addr);
assert_int_equal(rc, 1);
- rc = connect(s, (struct sockaddr *)&sin6, slen);
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
assert_int_equal(rc, 0);
for (i = 0; i < 10; i++) {
diff --git a/tests/test_echo_udp_sendmsg_recvmsg.c b/tests/test_echo_udp_sendmsg_recvmsg.c
index caabdb4..111a9ae 100644
--- a/tests/test_echo_udp_sendmsg_recvmsg.c
+++ b/tests/test_echo_udp_sendmsg_recvmsg.c
@@ -34,8 +34,9 @@ static void teardown(void **state)
static void test_sendto_recvfrom_ipv4(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
char send_buf[64] = {0};
char recv_buf[64] = {0};
ssize_t ret;
@@ -48,20 +49,20 @@ static void test_sendto_recvfrom_ipv4(void **state)
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
rc = inet_pton(AF_INET,
torture_server_address(AF_INET),
- &sin.sin_addr);
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
for (i = 0; i < 10; i++) {
char ip[INET_ADDRSTRLEN] = {0};
const char *a;
- struct sockaddr_in srv_in;
- socklen_t rlen = sizeof(srv_in);
+ struct torture_address srv_in = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
struct msghdr s_msg;
struct msghdr r_msg;
struct iovec s_iov;
@@ -71,8 +72,8 @@ static void test_sendto_recvfrom_ipv4(void **state)
ZERO_STRUCT(s_msg);
- s_msg.msg_name = (struct sockaddr *)(void *)&sin;
- s_msg.msg_namelen = slen;
+ s_msg.msg_name = &addr.sa.s;
+ s_msg.msg_namelen = addr.sa_socklen;
s_iov.iov_base = send_buf;
s_iov.iov_len = sizeof(send_buf);
@@ -85,8 +86,8 @@ static void test_sendto_recvfrom_ipv4(void **state)
ZERO_STRUCT(r_msg);
- r_msg.msg_name = (struct sockaddr *)(void *)&srv_in;
- r_msg.msg_namelen = rlen;
+ r_msg.msg_name = &srv_in.sa.s;
+ r_msg.msg_namelen = srv_in.sa_socklen;
r_iov.iov_base = recv_buf;
r_iov.iov_len = sizeof(recv_buf);
@@ -97,7 +98,7 @@ static void test_sendto_recvfrom_ipv4(void **state)
ret = recvmsg(s, &r_msg, 0);
assert_int_not_equal(ret, -1);
- a = inet_ntop(AF_INET, &srv_in.sin_addr, ip, sizeof(ip));
+ a = inet_ntop(AF_INET, &srv_in.sa.in.sin_addr, ip, sizeof(ip));
assert_non_null(a);
assert_string_equal(a, torture_server_address(AF_INET));
@@ -110,8 +111,9 @@ static void test_sendto_recvfrom_ipv4(void **state)
#ifdef HAVE_IPV6
static void test_sendto_recvfrom_ipv6(void **state)
{
- struct sockaddr_in6 sin6;
- socklen_t slen = sizeof(struct sockaddr_in6);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in6),
+ };
char send_buf[64] = {0};
char recv_buf[64] = {0};
ssize_t ret;
@@ -124,20 +126,20 @@ static void test_sendto_recvfrom_ipv6(void **state)
s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin6);
- sin6.sin6_family = AF_INET6;
- sin6.sin6_port = htons(torture_server_port());
+ addr.sa.in6.sin6_family = AF_INET6;
+ addr.sa.in6.sin6_port = htons(torture_server_port());
rc = inet_pton(AF_INET6,
torture_server_address(AF_INET6),
- &sin6.sin6_addr);
+ &addr.sa.in6.sin6_addr);
assert_int_equal(rc, 1);
for (i = 0; i < 10; i++) {
char ip[INET6_ADDRSTRLEN] = {0};
const char *a;
- struct sockaddr_in6 srv_in6;
- socklen_t rlen = sizeof(srv_in6);
+ struct torture_address srv_in6 = {
+ .sa_socklen = sizeof(struct sockaddr_in6),
+ };
struct msghdr s_msg;
struct msghdr r_msg;
struct iovec s_iov;
@@ -147,8 +149,8 @@ static void test_sendto_recvfrom_ipv6(void **state)
ZERO_STRUCT(s_msg);
- s_msg.msg_name = (struct sockaddr *)(void *)&sin6;
- s_msg.msg_namelen = slen;
+ s_msg.msg_name = &addr.sa.s;
+ s_msg.msg_namelen = addr.sa_socklen;
s_iov.iov_base = send_buf;
s_iov.iov_len = sizeof(send_buf);
@@ -160,8 +162,8 @@ static void test_sendto_recvfrom_ipv6(void **state)
assert_int_not_equal(ret, -1);
ZERO_STRUCT(r_msg);
- r_msg.msg_name = (struct sockaddr *)(void *)&srv_in6;
- r_msg.msg_namelen = rlen;
+ r_msg.msg_name = &srv_in6.sa.s;
+ r_msg.msg_namelen = srv_in6.sa_socklen;
r_iov.iov_base = recv_buf;
r_iov.iov_len = sizeof(recv_buf);
@@ -172,7 +174,7 @@ static void test_sendto_recvfrom_ipv6(void **state)
ret = recvmsg(s, &r_msg, 0);
assert_int_not_equal(ret, -1);
- a = inet_ntop(AF_INET6, &srv_in6.sin6_addr, ip, sizeof(ip));
+ a = inet_ntop(AF_INET6, &srv_in6.sa.in6.sin6_addr, ip, sizeof(ip));
assert_non_null(a);
assert_string_equal(a, torture_server_address(AF_INET6));
diff --git a/tests/test_echo_udp_sendto_recvfrom.c b/tests/test_echo_udp_sendto_recvfrom.c
index b0ed24a..88f8773 100644
--- a/tests/test_echo_udp_sendto_recvfrom.c
+++ b/tests/test_echo_udp_sendto_recvfrom.c
@@ -34,8 +34,9 @@ static void teardown(void **state)
static void test_sendto_recvfrom_ipv4(void **state)
{
- struct sockaddr_in sin;
- socklen_t slen = sizeof(struct sockaddr_in);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
char send_buf[64] = {0};
char recv_buf[64] = {0};
ssize_t ret;
@@ -48,20 +49,20 @@ static void test_sendto_recvfrom_ipv4(void **state)
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(torture_server_port());
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
rc = inet_pton(AF_INET,
torture_server_address(AF_INET),
- &sin.sin_addr);
+ &addr.sa.in.sin_addr);
assert_int_equal(rc, 1);
for (i = 0; i < 10; i++) {
char ip[INET_ADDRSTRLEN] = {0};
const char *a;
- struct sockaddr_in srv_in;
- socklen_t rlen = sizeof(srv_in);
+ struct torture_address srv_in = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
@@ -69,19 +70,19 @@ static void test_sendto_recvfrom_ipv4(void **state)
send_buf,
sizeof(send_buf),
0,
- (struct sockaddr *)(void *)&sin,
- slen);
+ &addr.sa.s,
+ addr.sa_socklen);
assert_int_not_equal(ret, -1);
ret = recvfrom(s,
recv_buf,
sizeof(recv_buf),
0,
- (struct sockaddr *)&srv_in,
- &rlen);
+ &srv_in.sa.s,
+ &srv_in.sa_socklen);
assert_int_not_equal(ret, -1);
- a = inet_ntop(AF_INET, &srv_in.sin_addr, ip, sizeof(ip));
+ a = inet_ntop(AF_INET, &srv_in.sa.in.sin_addr, ip, sizeof(ip));
assert_non_null(a);
assert_string_equal(a, torture_server_address(AF_INET));
@@ -92,8 +93,8 @@ static void test_sendto_recvfrom_ipv4(void **state)
send_buf,
sizeof(send_buf),
0,
- (struct sockaddr *)(void *)&sin,
- slen);
+ &addr.sa.s,
+ addr.sa_socklen);
assert_int_not_equal(ret, -1);
ret = recvfrom(s,
@@ -110,8 +111,9 @@ static void test_sendto_recvfrom_ipv4(void **state)
#ifdef HAVE_IPV6
static void test_sendto_recvfrom_ipv6(void **state)
{
- struct sockaddr_in6 sin6;
- socklen_t slen = sizeof(struct sockaddr_in6);
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in6),
+ };
char send_buf[64] = {0};
char recv_buf[64] = {0};
ssize_t ret;
@@ -124,20 +126,20 @@ static void test_sendto_recvfrom_ipv6(void **state)
s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
assert_int_not_equal(s, -1);
- ZERO_STRUCT(sin6);
- sin6.sin6_family = AF_INET6;
- sin6.sin6_port = htons(torture_server_port());
+ addr.sa.in6.sin6_family = AF_INET6;
+ addr.sa.in6.sin6_port = htons(torture_server_port());
rc = inet_pton(AF_INET6,
torture_server_address(AF_INET6),
- &sin6.sin6_addr);
+ &addr.sa.in6.sin6_addr);
assert_int_equal(rc, 1);
for (i = 0; i < 10; i++) {
char ip[INET6_ADDRSTRLEN] = {0};
const char *a;
- struct sockaddr_in6 srv_in6;
- socklen_t rlen = sizeof(srv_in6);
+ struct torture_address srv_in6 = {
+ .sa_socklen = sizeof(struct sockaddr_in6),
+ };
snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
@@ -145,19 +147,19 @@ static void test_sendto_recvfrom_ipv6(void **state)
send_buf,
sizeof(send_buf),
0,
- (struct sockaddr *)(void *)&sin6,
- slen);
+ &addr.sa.s,
+ addr.sa_socklen);
assert_int_not_equal(ret, -1);
ret = recvfrom(s,
recv_buf,
sizeof(recv_buf),
0,
- (struct sockaddr *)&srv_in6,
- &rlen);
+ &srv_in6.sa.s,
+ &srv_in6.sa_socklen);
assert_int_not_equal(ret, -1);
- a = inet_ntop(AF_INET6, &srv_in6.sin6_addr, ip, sizeof(ip));
+ a = inet_ntop(AF_INET6, &srv_in6.sa.in6.sin6_addr, ip, sizeof(ip));
assert_non_null(a);
assert_string_equal(a, torture_server_address(AF_INET6));
@@ -168,8 +170,8 @@ static void test_sendto_recvfrom_ipv6(void **state)
send_buf,
sizeof(send_buf),
0,
- (struct sockaddr *)(void *)&sin6,
- slen);
+ &addr.sa.s,
+ addr.sa_socklen);
assert_int_not_equal(ret, -1);
ret = recvfrom(s,
diff --git a/tests/torture.h b/tests/torture.h
index ffc3567..921195d 100644
--- a/tests/torture.h
+++ b/tests/torture.h
@@ -36,6 +36,10 @@
#include "config.h"
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/in.h>
+
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
@@ -44,6 +48,19 @@
#include <stdint.h>
#include <string.h>
+struct torture_address {
+ socklen_t sa_socklen;
+ union {
+ struct sockaddr s;
+ struct sockaddr_in in;
+#ifdef HAVE_IPV6
+ struct sockaddr_in6 in6;
+#endif
+ struct sockaddr_un un;
+ struct sockaddr_storage ss;
+ } sa;
+};
+
struct torture_state {
char *socket_dir;
char *pcap_file;