#include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #define __KERNEL__ #include <asm/types.h> #undef __KERNEL__ #include <linux/ethtool.h> #include <linux/sockios.h> #include <net/if.h> #include <sys/ioctl.h> #include <arpa/inet.h> /* this is straight from beej's network tutorial. It is a nice wrapper * for inet_ntop and helpes to make the program IPv6 ready */ char *get_ip_str(const struct sockaddr *sa, char *s, size_t maxlen) { switch(sa->sa_family) { case AF_INET: inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), s, maxlen); break; case AF_INET6: inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr), s, maxlen); break; default: strncpy(s, "Unknown AF", maxlen); return NULL; } return s; } int main (int argc, char **argv) { char buf[1024] = {0}; struct ifconf ifc = {0}; struct ifreq *ifr = NULL; int sck = 0; int nInterfaces = 0; int i = 0; struct ifreq ifr_subnet; struct sockaddr *addr_subnet = NULL; /* Get a socket handle. */ sck = socket(AF_INET, SOCK_DGRAM, 0); if(-1 == sck) { perror("socket"); return 1; } /* Query available interfaces. */ ifc.ifc_len = sizeof(buf); ifc.ifc_buf = buf; if(-1 == ioctl(sck, SIOCGIFCONF, &ifc)) { perror("ioctl(SIOCGIFCONF)"); close (sck); return 1; } /* Iterate through the list of interfaces. */ ifr = ifc.ifc_req; nInterfaces = ifc.ifc_len / sizeof(struct ifreq); for(i = 0; i < nInterfaces; i++) { struct ifreq *item = &ifr[i]; /* Show the device name and IP address */ struct sockaddr *addr = &(item->ifr_addr); char ip[INET6_ADDRSTRLEN]; printf("%s: IP %s", item->ifr_name, get_ip_str(addr, ip, INET6_ADDRSTRLEN)); /* Get the MAC address */ if(-1 == ioctl(sck, SIOCGIFHWADDR, item)) { perror("ioctl(SIOCGIFHWADDR)"); close (sck); return 1; } /* display result */ printf(", MAC %.2x:%.2x:%.2x:%.2x:%.2x:%.2x ", (unsigned char)item->ifr_hwaddr.sa_data[0], (unsigned char)item->ifr_hwaddr.sa_data[1], (unsigned char)item->ifr_hwaddr.sa_data[2], (unsigned char)item->ifr_hwaddr.sa_data[3], (unsigned char)item->ifr_hwaddr.sa_data[4], (unsigned char)item->ifr_hwaddr.sa_data[5]); /* Reset the memory allocated for ifreq */ memset (&ifr_subnet, 0, sizeof (struct ifreq)); /* Update interface name into ifreq */ strcpy (ifr_subnet.ifr_name, item->ifr_name); /* Call ioctl function */ if(-1 == ioctl (sck, SIOCGIFNETMASK, &ifr_subnet )) { perror("ioctl(SIOCGIFNETMASK)"); close (sck); return 1; } addr_subnet = &(ifr_subnet.ifr_addr); printf("SubnetMask: %s\n", get_ip_str(addr_subnet, ip, INET6_ADDRSTRLEN)); } close (sck); return 0; }
Reference: http://www.adamrisi.com/?p=84
No comments :
Post a Comment