Skip to content

Instantly share code, notes, and snippets.

@mvonthron
Last active May 13, 2016 19:20
Show Gist options
  • Save mvonthron/7c819befd448937b647b to your computer and use it in GitHub Desktop.
Save mvonthron/7c819befd448937b647b to your computer and use it in GitHub Desktop.
List and describe available network interfaces
#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;
}
@mvonthron
Copy link
Author

Example output:

% ./findInterfaces                                     
Returned 120 bytes: 3 interfaces:
lo:
  - MAC: 00:00:00:00:00:00
  - index: 1
  - addr: 127.0.0.1 [0x7f000001]
  - netmask: 255.0.0.0 [0xff000000]
  - broadcast: 0.0.0.0 [0x00000000]
  - flags: loopback, up, running, /!\ brodcast invalid, /
  - is wireless: false
  - bounds: [127.0.0.0 - 127.255.255.255]

eth0:
  - MAC: aa:bb:cc:dd:ee:ff
  - index: 2
  - addr: 192.168.20.58 [0xc0a8143a]
  - netmask: 255.255.224.0 [0xffffe000]
  - broadcast: 192.168.31.255 [0xc0a81fff]
  - flags: /, up, running, brodcast valid, /
  - is wireless: false
  - bounds: [192.168.0.0 - 192.168.31.255]

wlan0:
  - MAC: aa:bb:cc:dd:ee:ff
  - index: 3
  - addr: 192.168.201.138 [0xc0a8c98a]
  - netmask: 255.255.224.0 [0xffffe000]
  - broadcast: 192.168.223.255 [0xc0a8dfff]
  - flags: /, up, running, brodcast valid, /
  - is wireless: true (IEEE 802.11bgn)
  - bounds: [192.168.192.0 - 192.168.223.255]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment