changeset 39230:9626419f9db3

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).
author Bruno Haible <bruno@clisp.org>
date Sat, 27 Jan 2018 08:52:31 +0100
parents cf2037479174
children 05af34a75041
files ChangeLog modules/getsockname-tests tests/test-getsockname.c
diffstat 3 files changed, 66 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Jan 26 18:08:36 2018 -0800
+++ b/ChangeLog	Sat Jan 27 08:52:31 2018 +0100
@@ -1,3 +1,13 @@
+2018-01-27  Bruno Haible  <bruno@clisp.org>
+
+	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  <eggert@cs.ucla.edu>
 
 	manywarnings: fix maintainer comment
--- a/modules/getsockname-tests	Fri Jan 26 18:08:36 2018 -0800
+++ b/modules/getsockname-tests	Sat Jan 27 08:52:31 2018 +0100
@@ -5,11 +5,19 @@
 
 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)
--- a/tests/test-getsockname.c	Fri Jan 26 18:08:36 2018 -0800
+++ b/tests/test-getsockname.c	Sat Jan 27 08:52:31 2018 +0100
@@ -21,13 +21,47 @@
 #include "signature.h"
 SIGNATURE_CHECK (getsockname, int, (int, struct sockaddr *, socklen_t *));
 
-#include <errno.h>
+#include <stdio.h>
+#include <string.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
 #include <unistd.h>
+#include <errno.h>
 
 #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 @@
     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;
 }