]> git.sur5r.net Git - i3/i3status/blob - src/first_network_device.c
first_eth_interface: ignore MAC addresses, look for IPv4/IPv6 addresses
[i3/i3status] / src / first_network_device.c
1 // vim:ts=4:sw=4:expandtab
2 #include <sys/stat.h>
3 #include <stdlib.h>
4 #include <ifaddrs.h>
5
6 #include "i3status.h"
7
8 const char *first_eth_interface(const net_type_t type) {
9     static char *interface = NULL;
10     struct ifaddrs *ifaddr, *addrp;
11     struct stat stbuf;
12     static char path[1024];
13
14     getifaddrs(&ifaddr);
15
16     if (ifaddr == NULL)
17         return NULL;
18
19     free(interface);
20     interface = NULL;
21     for (addrp = ifaddr;
22          addrp != NULL;
23          addrp = addrp->ifa_next) {
24         if (strncasecmp("lo", addrp->ifa_name, strlen("lo")) == 0)
25             continue;
26         if (addrp->ifa_addr == NULL)
27             continue;
28         // Skip PF_PACKET addresses (MAC addresses), as they are present on any
29         // ethernet interface.
30         if (addrp->ifa_addr->sa_family != AF_INET &&
31             addrp->ifa_addr->sa_family != AF_INET6)
32             continue;
33         // Skip this interface if it is a wireless interface.
34         snprintf(path, sizeof(path), "/sys/class/net/%s/wireless", addrp->ifa_name);
35         const bool is_wireless = (stat(path, &stbuf) == 0);
36         if ((is_wireless && type == NET_TYPE_ETHERNET) ||
37             (!is_wireless && type == NET_TYPE_WIRELESS))
38             continue;
39         interface = strdup(addrp->ifa_name);
40         break;
41     }
42
43     freeifaddrs(ifaddr);
44     return interface;
45 }