Last active
May 13, 2016 19:20
-
-
Save mvonthron/7c819befd448937b647b to your computer and use it in GitHub Desktop.
List and describe available network interfaces
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <unistd.h> | |
#include <string.h> | |
#include <arpa/inet.h> | |
#include <sys/socket.h> | |
#include <sys/ioctl.h> | |
#include <linux/wireless.h> | |
int main(int argc, char **argv) | |
{ | |
int sock = -1; | |
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { | |
perror("socket"); | |
return 0; | |
} | |
static const int BUFFER_LEN = 16000; | |
char buffer[BUFFER_LEN]; | |
struct ifconf list; | |
list.ifc_ifcu.ifcu_buf = buffer; | |
list.ifc_len = BUFFER_LEN; | |
if (ioctl(sock, SIOCGIFCONF, &list) != -1) { | |
if(list.ifc_len == BUFFER_LEN){ | |
printf("Buffer full, probably overflowed, should try again.\n"); | |
}else{ | |
int nb = list.ifc_len / sizeof(struct ifreq); | |
printf("Returned %d bytes: %d interfaces:", list.ifc_len, nb); | |
for(int i=0; i<nb; i++){ | |
struct ifreq iface; | |
unsigned addr, netmask, broadcast, upper, lower, flags = 0; | |
printf("\n%s:\n", list.ifc_req[i].ifr_name); | |
memset(&iface, 0, sizeof(iface)); | |
strncpy(iface.ifr_name, list.ifc_req[i].ifr_name, IFNAMSIZ); | |
/* MAC address */ | |
if (ioctl(sock, SIOCGIFHWADDR, &iface) != -1) { | |
printf(" - MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", | |
(unsigned char) iface.ifr_hwaddr.sa_data[0], (unsigned char) iface.ifr_hwaddr.sa_data[1], (unsigned char) iface.ifr_hwaddr.sa_data[2], | |
(unsigned char) iface.ifr_hwaddr.sa_data[3], (unsigned char) iface.ifr_hwaddr.sa_data[4], (unsigned char) iface.ifr_hwaddr.sa_data[5]); | |
}else printf("*** FAILED SIOCGIFHWADDR\n"); | |
/* iface index */ | |
if (ioctl(sock, SIOCGIFINDEX, &iface) != -1) { | |
printf(" - index: %d\n", iface.ifr_ifindex); | |
}else printf("*** FAILED SIOCGIFINDEX"); | |
/* ip addr */ | |
if (ioctl(sock, SIOCGIFADDR, &iface) != -1) { | |
addr = ntohl( ((struct sockaddr_in *)&iface.ifr_addr )->sin_addr.s_addr ); | |
printf(" - addr: %s [0x%08x]\n", inet_ntoa(((struct sockaddr_in *)&iface.ifr_addr )->sin_addr), addr); | |
}else printf("*** FAILED SIOCGIFADDR"); | |
/* netmask */ | |
if (ioctl(sock, SIOCGIFNETMASK, &iface) != -1) { | |
netmask = ntohl( ((struct sockaddr_in *)&iface.ifr_addr )->sin_addr.s_addr ); | |
printf(" - netmask: %s [0x%08x]\n", inet_ntoa(((struct sockaddr_in *)&iface.ifr_netmask )->sin_addr), netmask); | |
}else printf("*** FAILED SIOCGIFNETMASK"); | |
/* broadcast */ | |
if (ioctl(sock, SIOCGIFBRDADDR, &iface) != -1) { | |
broadcast = ntohl( ((struct sockaddr_in *)&iface.ifr_addr )->sin_addr.s_addr ); | |
printf(" - broadcast: %s [0x%08x]\n", inet_ntoa(((struct sockaddr_in *)&iface.ifr_broadaddr )->sin_addr), broadcast); | |
}else printf("*** FAILED SIOCSIFBRDADDR\n"); | |
/* flags */ | |
if (ioctl(sock, SIOCGIFFLAGS, &iface) != -1) { | |
flags = iface.ifr_flags; | |
printf(" - flags: %s, %s, %s, %s, %s\n", | |
flags & IFF_LOOPBACK ? "loopback": "/", | |
flags & IFF_UP ? "up": "/", | |
flags & IFF_RUNNING ? "running": "/", | |
flags & IFF_BROADCAST ? "brodcast valid": "/!\\ brodcast invalid", | |
flags & IFF_PROMISC ? "promiscuous": "/" | |
); | |
}else printf("*** FAILED SIOCGIFFLAGS"); | |
/* is wireless? */ | |
struct iwreq iw; | |
memset(&iw, 0, sizeof(iw)); | |
strncpy(iw.ifr_name, iface.ifr_name, IFNAMSIZ); | |
if (ioctl(sock, SIOCGIWNAME, &iw) != -1) { | |
printf(" - is wireless: true (%s)\n", iw.u.name); | |
}else { | |
printf(" - is wireless: false\n"); | |
} | |
/** upper/lower bound */ | |
upper = addr | ~netmask; | |
lower = addr & netmask; | |
struct in_addr u, l; | |
u.s_addr = ntohl(upper); | |
l.s_addr = ntohl(lower); | |
/* splitted printf because inet_ntoa as a static buffer overwritten by successive calls */ | |
printf(" - bounds: [%s - ", inet_ntoa(l)); | |
printf("%s]\n", inet_ntoa(u)); | |
} | |
} | |
} | |
close(sock); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Example output: