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