#include #include #include #include #include #include #include #include #include #include #include #define SIZEOF_ARRAY(array) (sizeof(array)/sizeof(array[0])) #define PROFILE(X) printtime(X, __FUNCTION__, __LINE__) static void printtime(const char *s, const char *func, int line) { struct timeval tv; if (gettimeofday(&tv, NULL) == 0) { printf("DEBUG %10ld.%06ld %s %d: %s\n", tv.tv_sec, tv.tv_usec, func, line, s); } else { printf("DEBUG %s %d: %s\n", func, line, s); } } int main(void) { char buf[1024]; struct ifconf ifc; struct intf_t *intf; // Interfaces struct ifreq *ifr; int sock; int result; int devices = 0; char *ptr; ifc.ifc_buf = buf; ifc.ifc_len = SIZEOF_ARRAY(buf); sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("Couldn't open socket\n"); return EXIT_FAILURE; } PROFILE("SIOCGIFCONF start"); result = ioctl(sock, SIOCGIFCONF, &ifc); PROFILE("SIOCGIFCONF end"); ptr = buf; while (ptr < buf + ifc.ifc_len) { ifr = (struct ifreq *)ptr; printf("Interface: %s\n", ifr->ifr_name); PROFILE("SIOCGIFADDR start"); result = ioctl(sock, SIOCGIFADDR, ifr); PROFILE("SIOCGIFADDR end"); switch (ifr->ifr_addr.sa_family) { /* case AF_LINK: printf(" Family: AF_LINK\n"; break; */ case AF_INET: printf(" Family: AF_INET\n"); printf(" Address: %08x\n", ntohl(((struct sockaddr_in *)(&ifr->ifr_addr))->sin_addr.s_addr)); PROFILE("SIOCGIFNETMASK start"); result = ioctl(sock, SIOCGIFNETMASK, ifr); PROFILE("SIOCGIFNETMASK end"); printf(" Mask: %08x\n", ntohl(((struct sockaddr_in *)(&ifr->ifr_addr))->sin_addr.s_addr)); PROFILE("SIOCGIFBRDADDR start"); result = ioctl(sock, SIOCGIFBRDADDR, ifr); PROFILE("SIOCGIFBRDADDR end"); printf(" Broadcast: %08x\n", ntohl(((struct sockaddr_in *)(&ifr->ifr_addr))->sin_addr.s_addr)); PROFILE("SIOCGIFDSTADDR start"); result = ioctl(sock, SIOCGIFDSTADDR, ifr); PROFILE("SIOCGIFDSTADDR end"); printf(" Dest: %08x\n", ntohl(((struct sockaddr_in *)(&ifr->ifr_addr))->sin_addr.s_addr)); PROFILE("SIOCGIFFLAGS start"); result = ioctl(sock, SIOCGIFFLAGS, ifr); PROFILE("SIOCGIFFLAGS end"); printf(" Flags: %08x\n", ifr->ifr_flags); break; case AF_INET6: printf(" Family: AF_INET6\n"); break; default: printf(" Family: %d\n", ifr->ifr_addr.sa_family); break; } ptr += sizeof(struct ifreq); } return EXIT_SUCCESS; }