return true;
}
+static bool is_virtual(const char *ifname) {
+ char path[1024];
+ char *target = NULL;
+ bool is_virtual = false;
+
+ snprintf(path, sizeof(path), "/sys/class/net/%s", ifname);
+ if ((target = realpath(path, NULL))) {
+ if (BEGINS_WITH(target, "/sys/devices/virtual/")) {
+ is_virtual = true;
+ }
+ }
+
+ free(target);
+ return is_virtual;
+}
+
static net_type_t iface_type(const char *ifname) {
#ifdef __linux__
char devtype[32];
if (!sysfs_devtype(devtype, sizeof(devtype), ifname))
return NET_TYPE_OTHER;
+ /* Default to Ethernet when no devtype is available */
if (!devtype[0])
return NET_TYPE_ETHERNET;
strlcpy(bssid.i_name, ifname, sizeof(bssid.i_name));
ibssid = ioctl(s, SIOCG80211BSSID, &bssid);
- if (ibssid == 0 || inwid == 0)
+ if (ibssid == 0 || inwid == 0) {
+ close(s);
return NET_TYPE_WIRELESS;
+ }
(void)memset(&ifmr, 0, sizeof(ifmr));
(void)strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name));
- if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) {
+ close(s);
return NET_TYPE_OTHER;
- else
+ } else {
+ close(s);
return NET_TYPE_ETHERNET;
-
- close(s);
+ }
#else
#error Missing implementation to determine interface type.
#endif
iftype = iface_type(addrp->ifa_name);
if (iftype != type)
continue;
+ if (is_virtual(addrp->ifa_name))
+ continue;
interface = strdup(addrp->ifa_name);
break;
}