From 64464f53eb2748ee9c615775a347685f2115d040 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Fri, 3 Apr 2015 03:57:00 -0500 Subject: add GNU libc test for ifaddrs.c --- test/inet/Makefile.in | 2 +- test/inet/tst-ifaddrs.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 test/inet/tst-ifaddrs.c diff --git a/test/inet/Makefile.in b/test/inet/Makefile.in index 38aec616b..2108d1975 100644 --- a/test/inet/Makefile.in +++ b/test/inet/Makefile.in @@ -3,7 +3,7 @@ # ifeq ($(UCLIBC_HAS_IPV4)$(UCLIBC_HAS_IPV6),) TESTS_DISABLED := bug-if1 gethost_r-align gethostid if_nameindex tst-aton \ - tst-network tst-ntoa + tst-network tst-ntoa test-ifaddrs endif ifeq ($(UCLIBC_HAS_SOCKET)$(UCLIBC_HAS_IPV4)$(UCLIBC_HAS_IPV6),) diff --git a/test/inet/tst-ifaddrs.c b/test/inet/tst-ifaddrs.c new file mode 100644 index 000000000..6e6c01570 --- /dev/null +++ b/test/inet/tst-ifaddrs.c @@ -0,0 +1,99 @@ +/* Test listing of network interface addresses. + Copyright (C) 2002-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include + +static int failures; + +static const char * +addr_string (struct sockaddr *sa, char *buf, size_t size) +{ + if (sa == NULL) + return ""; + + switch (sa->sa_family) + { + case AF_INET: + return inet_ntop (AF_INET, &((struct sockaddr_in *) sa)->sin_addr, + buf, size); + case AF_INET6: + return inet_ntop (AF_INET6, &((struct sockaddr_in6 *) sa)->sin6_addr, + buf, size); +#ifdef AF_LINK + case AF_LINK: + return ""; +#endif + case AF_UNSPEC: + return "---"; + +#ifdef AF_PACKET + case AF_PACKET: + return ""; +#endif + + default: + ++failures; + printf ("sa_family=%d %08x\n", sa->sa_family, + *(int*)&((struct sockaddr_in *) sa)->sin_addr.s_addr); + return ""; + } +} + + +static int +do_test (void) +{ + struct ifaddrs *ifaces, *ifa; + + if (getifaddrs (&ifaces) < 0) + { + if (errno != ENOSYS) + { + printf ("Couldn't get any interfaces: %s.\n", strerror (errno)); + exit (1); + } + /* The function is simply not implemented. */ + exit (0); + } + + puts ("\ +Name Flags Address Netmask Broadcast/Destination"); + + for (ifa = ifaces; ifa != NULL; ifa = ifa->ifa_next) + { + char abuf[64], mbuf[64], dbuf[64]; + printf ("%-15s%#.4x %-15s %-15s %-15s\n", + ifa->ifa_name, ifa->ifa_flags, + addr_string (ifa->ifa_addr, abuf, sizeof (abuf)), + addr_string (ifa->ifa_netmask, mbuf, sizeof (mbuf)), + addr_string (ifa->ifa_broadaddr, dbuf, sizeof (dbuf))); + } + + freeifaddrs (ifaces); + + return failures ? 1 : 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" -- cgit v1.2.3