#include #include #include #include #include #include #include #include /* getifaddrs() */ #include /* ether_ntoa() */ #include /* struct sockaddr_ll */ char *generic_ntoa(struct sockaddr *sa) { static char *str = 0; static size_t size = 0; struct sockaddr_ll *sll; if ( size ) { free(str); str = 0; size = 0; } switch ( sa->sa_family ) { case AF_INET: size = INET_ADDRSTRLEN; str = malloc(size); memset((void *)str, 0, size); inet_ntop(((struct sockaddr_in *)sa)->sin_family, &(((struct sockaddr_in *)sa)->sin_addr), str, size); break; case AF_INET6: size = INET6_ADDRSTRLEN; str = malloc(size); memset((void *)str, 0, size); inet_ntop(((struct sockaddr_in6 *)sa)->sin6_family, &(((struct sockaddr_in6 *)sa)->sin6_addr), str, size); break; case AF_PACKET: sll = (struct sockaddr_ll *)sa; switch (sll->sll_hatype) { case ARPHRD_LOOPBACK: /* loopback interfaces don't have a hardware address */ break; case ARPHRD_ETHER: str = ether_ntoa((struct ether_addr *)(sll->sll_addr)); break; default: size = 40; str = malloc(size); memset((void *)str, 0, size); snprintf(str, size, "Can't decode raw packet type %d", sll->sll_hatype); break; } break; default: size = 30; str = malloc(size); memset((void *)str, 0, size); snprintf(str, size, "Can't decode family %d", sa->sa_family); break; } return str; } int main() { struct ifaddrs *id; char *address_str; int val; val = getifaddrs(&id); for ( ; id != NULL ; id = id->ifa_next ) { printf("Network Interface: %s\n", id->ifa_name); address_str = generic_ntoa(id->ifa_addr); if ( address_str ) { printf("Address: %s\n", address_str); } if ( id->ifa_netmask != NULL ) { address_str = generic_ntoa(id->ifa_netmask); printf("Netmask: %s\n", address_str); } printf("\n"); } return 0; }