template<typename... Args> explicit tuntap_base(const Args&... args) : super(args...), m_interface(kwget(interface, tuntap_default_name, args...)), m_type_str(kwget(type, tuntap_default_type, args...)), m_type(iface_type()) { create(); read_mtu(); }
const char *first_eth_interface(const net_type_t type) { static char *interface = NULL; struct ifaddrs *ifaddr, *addrp; net_type_t iftype; getifaddrs(&ifaddr); if (ifaddr == NULL) return NULL; free(interface); interface = NULL; for (addrp = ifaddr; addrp != NULL; addrp = addrp->ifa_next) { if (strncasecmp("lo", addrp->ifa_name, strlen("lo")) == 0) continue; if (addrp->ifa_addr == NULL) continue; // Skip PF_PACKET addresses (MAC addresses), as they are present on any // ethernet interface. if (addrp->ifa_addr->sa_family != AF_INET && addrp->ifa_addr->sa_family != AF_INET6) continue; // Skip this interface if it is a wireless interface. iftype = iface_type(addrp->ifa_name); if (iftype != type) continue; interface = strdup(addrp->ifa_name); break; } freeifaddrs(ifaddr); return interface; }