diff options
-rw-r--r-- | tests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/test_echo_tcp_bind.c | 163 | ||||
-rw-r--r-- | tests/test_echo_tcp_connect.c | 30 | ||||
-rw-r--r-- | tests/test_echo_tcp_get_peer_sock_name.c | 370 | ||||
-rw-r--r-- | tests/test_echo_tcp_socket.c | 20 | ||||
-rw-r--r-- | tests/test_echo_tcp_socket_options.c | 48 | ||||
-rw-r--r-- | tests/test_echo_tcp_write_read.c | 30 | ||||
-rw-r--r-- | tests/test_echo_tcp_writev_readv.c | 32 | ||||
-rw-r--r-- | tests/test_echo_udp_send_recv.c | 28 | ||||
-rw-r--r-- | tests/test_echo_udp_sendmsg_recvmsg.c | 54 | ||||
-rw-r--r-- | tests/test_echo_udp_sendto_recvfrom.c | 62 | ||||
-rw-r--r-- | tests/torture.h | 17 |
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; |