|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* Test listing of network interface addresses.
|
|
|
|
Copyright (C) 2002 Free Software Foundation, Inc. |
|
|
|
Copyright (C) 2002, 2004 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 |
|
|
|
@ -25,10 +25,44 @@ |
|
|
|
#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 "---"; |
|
|
|
|
|
|
|
case AF_PACKET: |
|
|
|
return "<packet>"; |
|
|
|
|
|
|
|
default: |
|
|
|
++failures; |
|
|
|
printf ("sa_family=%d %08x\n", sa->sa_family, |
|
|
|
*(int*)&((struct sockaddr_in *) sa)->sin_addr.s_addr); |
|
|
|
return "<unexpected sockaddr family>"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
main (void) |
|
|
|
{ |
|
|
|
int failures = 0; |
|
|
|
struct ifaddrs *ifaces, *ifa; |
|
|
|
|
|
|
|
if (getifaddrs (&ifaces) < 0) |
|
|
|
@ -48,43 +82,11 @@ Name Flags Address Netmask Broadcast/Destination"); |
|
|
|
for (ifa = ifaces; ifa != NULL; ifa = ifa->ifa_next) |
|
|
|
{ |
|
|
|
char abuf[64], mbuf[64], dbuf[64]; |
|
|
|
inline const char *addr_string (struct sockaddr *sa, char *buf) |
|
|
|
{ |
|
|
|
if (sa == NULL) |
|
|
|
return "<none>"; |
|
|
|
|
|
|
|
switch (sa->sa_family) |
|
|
|
{ |
|
|
|
case AF_INET: |
|
|
|
return inet_ntop (AF_INET, |
|
|
|
&((struct sockaddr_in *) sa)->sin_addr, |
|
|
|
buf, sizeof abuf); |
|
|
|
case AF_INET6: |
|
|
|
return inet_ntop (AF_INET6, |
|
|
|
&((struct sockaddr_in6 *) sa)->sin6_addr, |
|
|
|
buf, sizeof abuf); |
|
|
|
#ifdef AF_LINK |
|
|
|
case AF_LINK: |
|
|
|
return "<link>"; |
|
|
|
#endif |
|
|
|
case AF_UNSPEC: |
|
|
|
return "---"; |
|
|
|
|
|
|
|
case AF_PACKET: |
|
|
|
return "<packet>"; |
|
|
|
|
|
|
|
default: |
|
|
|
++failures; |
|
|
|
printf ("sa_family=%d %08x\n", sa->sa_family, |
|
|
|
*(int*)&((struct sockaddr_in *) sa)->sin_addr.s_addr); |
|
|
|
return "<unexpected sockaddr family>"; |
|
|
|
} |
|
|
|
} |
|
|
|
printf ("%-15s%#.4x %-15s %-15s %-15s\n", |
|
|
|
ifa->ifa_name, ifa->ifa_flags, |
|
|
|
addr_string (ifa->ifa_addr, abuf), |
|
|
|
addr_string (ifa->ifa_netmask, mbuf), |
|
|
|
addr_string (ifa->ifa_broadaddr, dbuf)); |
|
|
|
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); |
|
|
|
|