+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
#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)
{
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;
}