/* #define _GNU_SOURCE * To get defns of NI_MAXSERV and NI_MAXHOST */ #include #include #include #include #include #include #include #include #include #include void print_flags(unsigned int flags) { const char* sep = "", *sp = " "; if (flags & IFF_UP) { printf("%sup", sep); sep = sp; } if (flags & IFF_BROADCAST) { printf("%sbroadcast", sep); sep = sp; } if (flags & IFF_LOOPBACK) { printf("%sloopback", sep); sep = sp; } if (flags & IFF_NOTRAILERS) { printf("%snotrailers", sep); sep = sp; } if (flags & IFF_RUNNING) { printf("%srunning", sep); sep = sp; } if (flags & IFF_PROMISC) { printf("%spromisc", sep); sep = sp; } if (flags & IFF_MULTICAST) { printf("%smulticast", sep); sep = sp; } } int main(int argc, char *argv[]) { struct ifaddrs *ifaddr, *ifa; int family, s, n; char host[NI_MAXHOST]; struct ifreq ifr; struct ifreq_frndlyname iff; struct ifreq_frndlyname * iffp; struct ifaddrs_hwdata * ifhwdata; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } /* Walk through linked list, maintaining head pointer so we can free list later */ for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) { if (ifa->ifa_addr == NULL) continue; family = ifa->ifa_addr->sa_family; /* Display interface name and family (including symbolic form of the latter for the common families) */ printf("internal_name: \t%s\n",ifa->ifa_name); printf(" flags: \t%s ", (family == AF_INET) ? "AF_INET " : (family == AF_INET6) ? "AF_INET6" : "unknown "); print_flags(ifa->ifa_flags); printf("\n"); /* For an AF_INET* interface address, display the address */ if (family == AF_INET || family == AF_INET6) { s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s != 0) { printf("getnameinfo() failed: %s\n", gai_strerror(s)); exit(EXIT_FAILURE); } printf(" address:\t%s\n", host); ifhwdata=ifa->ifa_data; iffp=&(ifhwdata->ifa_frndlyname); printf(" friendly_name:\t%s\n\n", iffp->ifrf_friendlyname); } } freeifaddrs(ifaddr); exit(EXIT_SUCCESS); }