>From 46e7ff4afee45c1b2b52849bd36b3b258417ec51 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 27 Jan 2018 08:52:31 +0100 Subject: [PATCH 1/2] getsockname tests: More tests. * tests/test-getsockname.c (open_server_socket): New function, mostly copied from test-poll.c. (main): Check that getsockname fills in addr. * modules/getsockname-tests (Depends-on): Add the necessary dependencies. (test_getsockname_LDADD): Link with $(INET_PTON_LIB). --- ChangeLog | 10 ++++++++++ modules/getsockname-tests | 10 +++++++++- tests/test-getsockname.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4994460..70d4219 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2018-01-27 Bruno Haible + + getsockname tests: More tests. + * tests/test-getsockname.c (open_server_socket): New function, mostly + copied from test-poll.c. + (main): Check that getsockname fills in addr. + * modules/getsockname-tests (Depends-on): Add the necessary + dependencies. + (test_getsockname_LDADD): Link with $(INET_PTON_LIB). + 2018-01-26 Paul Eggert manywarnings: fix maintainer comment diff --git a/modules/getsockname-tests b/modules/getsockname-tests index 0134e4c..9141254 100644 --- a/modules/getsockname-tests +++ b/modules/getsockname-tests @@ -5,11 +5,19 @@ tests/macros.h Depends-on: netinet_in +arpa_inet +inet_pton +errno +perror sockets +socket +setsockopt +bind +listen configure.ac: Makefile.am: TESTS += test-getsockname check_PROGRAMS += test-getsockname -test_getsockname_LDADD = $(LDADD) @LIBSOCKET@ +test_getsockname_LDADD = $(LDADD) @LIBSOCKET@ $(INET_PTON_LIB) diff --git a/tests/test-getsockname.c b/tests/test-getsockname.c index 95f2217..2c951fb 100644 --- a/tests/test-getsockname.c +++ b/tests/test-getsockname.c @@ -21,13 +21,47 @@ #include "signature.h" SIGNATURE_CHECK (getsockname, int, (int, struct sockaddr *, socklen_t *)); -#include +#include +#include #include +#include #include +#include #include "sockets.h" #include "macros.h" +static int +open_server_socket (void) +{ + int s, x; + struct sockaddr_in ia; + + s = socket (AF_INET, SOCK_STREAM, 0); + + x = 1; + setsockopt (s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof (x)); + + memset (&ia, 0, sizeof (ia)); + ia.sin_family = AF_INET; + inet_pton (AF_INET, "0.0.0.0", &ia.sin_addr); + /* Port 0 means that the system should assign a port. */ + ia.sin_port = htons (0); + if (bind (s, (struct sockaddr *) &ia, sizeof (ia)) < 0) + { + perror ("bind"); + exit (77); + } + + if (listen (s, 1) < 0) + { + perror ("listen"); + exit (77); + } + + return s; +} + int main (void) { @@ -52,5 +86,17 @@ main (void) ASSERT (errno == EBADF); } + /* Test behaviour for a server socket. */ + { + int s = open_server_socket (); + struct sockaddr_in addr; + socklen_t addrlen = sizeof (addr); + + memset (&addr, 0, sizeof (addr)); + ASSERT (getsockname (s, (struct sockaddr *) &addr, &addrlen) == 0); + ASSERT (addr.sin_family == AF_INET); + ASSERT (ntohs (addr.sin_port) != 0); + } + return 0; } -- 2.7.4