1 // vim:ts=4:sw=4:expandtab
2 #include <sys/socket.h>
9 static bool sysfs_devtype(char *dest, size_t n, const char *ifnam) {
13 snprintf(buf, sizeof(buf), "/sys/class/net/%s/uevent", ifnam);
14 if ((fp = fopen(buf, "r")) == NULL)
19 while (fgets(buf, sizeof(buf), fp)) {
24 /* Line is too long to fit in the buffer */
25 if (buf[slen - 1] != '\n' && !feof(fp))
27 if ((s = strchr(buf, '='))) {
28 if (strncmp(buf, "DEVTYPE", s - buf))
31 strncpy(dest, ++s, n);
39 static net_type_t iface_type(const char *ifname) {
42 if (!sysfs_devtype(devtype, sizeof(devtype), ifname))
43 return NET_TYPE_OTHER;
46 return NET_TYPE_ETHERNET;
48 if (strcmp(devtype, "wlan") == 0)
49 return NET_TYPE_WIRELESS;
51 if (strcmp(devtype, "wwan") == 0)
52 return NET_TYPE_OTHER;
54 return NET_TYPE_OTHER;
57 const char *first_eth_interface(const net_type_t type) {
58 static char *interface = NULL;
59 struct ifaddrs *ifaddr, *addrp;
71 addrp = addrp->ifa_next) {
72 if (strncasecmp("lo", addrp->ifa_name, strlen("lo")) == 0)
74 if (addrp->ifa_addr == NULL)
76 // Skip PF_PACKET addresses (MAC addresses), as they are present on any
77 // ethernet interface.
78 if (addrp->ifa_addr->sa_family != AF_INET &&
79 addrp->ifa_addr->sa_family != AF_INET6)
81 // Skip this interface if it is a wireless interface.
82 iftype = iface_type(addrp->ifa_name);
85 interface = strdup(addrp->ifa_name);