Index: lib/libc/tests/sys/sendfile_test.c =================================================================== --- lib/libc/tests/sys/sendfile_test.c +++ lib/libc/tests/sys/sendfile_test.c @@ -42,6 +42,8 @@ #include #include #include +#include +#include #include @@ -51,11 +53,6 @@ #define SOURCE_FILE "source" #define DESTINATION_FILE "dest" -#define PORTRANGE_FIRST "net.inet.ip.portrange.first" -#define PORTRANGE_LAST "net.inet.ip.portrange.last" - -static int portrange_first, portrange_last; - static int get_int_via_sysctlbyname(const char *oidname) { @@ -71,31 +68,6 @@ return (int_value); } -static int -generate_random_port(int seed) -{ - int random_port; - - printf("Generating a random port with seed=%d\n", seed); - if (portrange_first == 0) { - portrange_first = get_int_via_sysctlbyname(PORTRANGE_FIRST); - printf("Port range lower bound: %d\n", portrange_first); - } - - if (portrange_last == 0) { - portrange_last = get_int_via_sysctlbyname(PORTRANGE_LAST); - printf("Port range upper bound: %d\n", portrange_last); - } - - srand((unsigned)seed); - - random_port = rand() % (portrange_last - portrange_first) + - portrange_first; - - printf("Random port generated: %d\n", random_port); - return (random_port); -} - static void resolve_localhost(struct addrinfo **res, int domain, int type, int port) { @@ -167,19 +139,16 @@ return (sock); } -/* - * XXX: use linear probing to find a free port and eliminate `port` argument as - * a [const] int (it will need to be a pointer so it can be passed back out of - * the function and can influence which port `setup_client(..)` connects on. - */ static int -setup_server(int domain, int type, int port) +setup_server(int domain, int type, int *port) { struct addrinfo *res; char host[NI_MAXHOST+1]; int error, sock; + struct sockaddr server; + socklen_t len; - resolve_localhost(&res, domain, type, port); + resolve_localhost(&res, domain, type, 0); sock = make_socket(res->ai_family, res->ai_socktype, res->ai_protocol); error = getnameinfo( @@ -194,11 +163,18 @@ /* Avoid a double print when forked by flushing. */ fflush(stdout); error = bind(sock, res->ai_addr, res->ai_addrlen); + len = res->ai_addrlen; freeaddrinfo(res); ATF_REQUIRE_EQ_MSG(error, 0, "bind failed: %s", strerror(errno)); error = listen(sock, 1); ATF_REQUIRE_EQ_MSG(error, 0, "listen failed: %s", strerror(errno)); + memset(&server, 0, sizeof(server)); + error = getsockname(sock, &server, &len); + ATF_REQUIRE_EQ_MSG(error, 0, "getsockname failed: %s", strerror(errno)); + struct sockaddr_in *server_in = (struct sockaddr_in *)&server; + *port = ntohs(server_in->sin_port); + return (sock); } @@ -251,7 +227,7 @@ } static int -setup_tcp_server(int domain, int port) +setup_tcp_server(int domain, int *port) { return (setup_server(domain, SOCK_STREAM, port)); @@ -345,8 +321,7 @@ fd = open(SOURCE_FILE, O_RDONLY); ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno)); - port = generate_random_port(__LINE__ + domain); - server_sock = setup_tcp_server(domain, port); + server_sock = setup_tcp_server(domain, &port); client_sock = setup_tcp_client(domain, port); server_pid = atf_utils_fork(); @@ -423,8 +398,7 @@ "memcmp showed data mismatch: '%s' != '%s'", DETERMINISTIC_PATTERN, shm_pointer); - port = generate_random_port(__LINE__ + domain); - server_sock = setup_tcp_server(domain, port); + server_sock = setup_tcp_server(domain, &port); client_sock = setup_tcp_client(domain, port); server_pid = atf_utils_fork(); @@ -480,8 +454,7 @@ { int client_sock, error, fd, port, server_sock; - port = generate_random_port(__LINE__ + domain); - server_sock = setup_tcp_server(domain, port); + server_sock = setup_tcp_server(domain, &port); client_sock = setup_tcp_client(domain, port); fd = -1; @@ -583,8 +556,7 @@ fd = open(SOURCE_FILE, O_RDONLY); ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno)); - port = generate_random_port(i * __LINE__ + domain); - server_sock = setup_tcp_server(domain, port); + server_sock = setup_tcp_server(domain, &port); client_sock = setup_tcp_client(domain, port); server_pid = atf_utils_fork(); @@ -693,8 +665,7 @@ hdtr.trl_cnt = 0; } - port = generate_random_port(i * __LINE__ + domain); - server_sock = setup_tcp_server(domain, port); + server_sock = setup_tcp_server(domain, &port); client_sock = setup_tcp_client(domain, port); rc = asprintf(&pattern, "%s%s%s", @@ -769,8 +740,6 @@ int client_sock, error, fd, port, server_sock; struct sf_hdtr *hdtr1, hdtr2, hdtr3; - port = generate_random_port(__LINE__ + domain); - hdtr1 = (struct sf_hdtr*)-1; memset(&hdtr2, 0, sizeof(hdtr2)); @@ -784,7 +753,7 @@ fd = open(SOURCE_FILE, O_CREAT|O_RDWR); ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno)); - server_sock = setup_tcp_server(domain, port); + server_sock = setup_tcp_server(domain, &port); client_sock = setup_tcp_client(domain, port); error = sendfile(fd, client_sock, 0, 0, hdtr1, NULL, SF_FLAGS(0, 0)); @@ -832,8 +801,7 @@ { int client_sock, error, fd, port, server_sock; - port = generate_random_port(__LINE__ + domain); - server_sock = setup_tcp_server(domain, port); + server_sock = setup_tcp_server(domain, &port); client_sock = setup_tcp_client(domain, port); fd = open(SOURCE_FILE, O_CREAT|O_RDWR); @@ -880,8 +848,7 @@ off_t sbytes; int client_sock, error, fd, port, server_sock; - port = generate_random_port(__LINE__ + domain); - server_sock = setup_tcp_server(domain, port); + server_sock = setup_tcp_server(domain, &port); client_sock = setup_tcp_client(domain, port); atf_utils_create_file(SOURCE_FILE, "%s", DETERMINISTIC_PATTERN); @@ -932,8 +899,7 @@ off_t *sbytes_p = (off_t*)-1; int client_sock, error, fd, port, server_sock; - port = generate_random_port(__LINE__ + domain); - server_sock = setup_tcp_server(domain, port); + server_sock = setup_tcp_server(domain, &port); client_sock = setup_tcp_client(domain, port); atf_utils_create_file(SOURCE_FILE, "%s", DETERMINISTIC_PATTERN); @@ -982,8 +948,7 @@ { int client_sock, error, fd, port; - port = generate_random_port(__LINE__ + domain); - client_sock = setup_tcp_server(domain, port); + client_sock = setup_tcp_server(domain, &port); fd = open(SOURCE_FILE, O_CREAT|O_RDWR); ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno)); @@ -1074,10 +1039,9 @@ static void s_negative_udp_socket_test(int domain) { - int client_sock, error, fd, port; + int client_sock, error, fd; - port = generate_random_port(__LINE__ + domain); - client_sock = setup_client(domain, SOCK_DGRAM, port); + client_sock = setup_client(domain, SOCK_DGRAM, 2424); fd = open(SOURCE_FILE, O_CREAT|O_RDWR); ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));