|  | /* Test listing of network interface addresses. | 
|  | Copyright (C) 2002-2016 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 | 
|  | <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #include <errno.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <ifaddrs.h> | 
|  | #include <netinet/in.h> | 
|  | #include <arpa/inet.h> | 
|  |  | 
|  | static int failures; | 
|  |  | 
|  | static const char * | 
|  | addr_string (struct sockaddr *sa, char *buf, size_t size) | 
|  | { | 
|  | if (sa == NULL) | 
|  | return "<none>"; | 
|  |  | 
|  | 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 "<link>"; | 
|  | #endif | 
|  | case AF_UNSPEC: | 
|  | return "---"; | 
|  |  | 
|  | #ifdef AF_PACKET | 
|  | case AF_PACKET: | 
|  | return "<packet>"; | 
|  | #endif | 
|  |  | 
|  | default: | 
|  | ++failures; | 
|  | printf ("sa_family=%d %08x\n", sa->sa_family, | 
|  | *(int*)&((struct sockaddr_in *) sa)->sin_addr.s_addr); | 
|  | return "<unexpected sockaddr family>"; | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | 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" |