/* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include #include #include #include #include #include #include #include #include #include #ifndef __ANDROID__ #include #endif #include #include namespace Swift { std::vector UnixNetworkEnvironment::getNetworkInterfaces() const { std::map interfaces; #ifndef __ANDROID__ ifaddrs* addrs = nullptr; int ret = getifaddrs(&addrs); if (ret != 0) { return std::vector(); } for (ifaddrs* a = addrs; a != nullptr; a = a->ifa_next) { std::string name(a->ifa_name); boost::optional address; if (a->ifa_addr->sa_family == PF_INET) { sockaddr_in* sa = reinterpret_cast(a->ifa_addr); address = HostAddress(reinterpret_cast(&(sa->sin_addr)), 4); } else if (a->ifa_addr->sa_family == PF_INET6) { sockaddr_in6* sa = reinterpret_cast(a->ifa_addr); address = HostAddress(reinterpret_cast(&(sa->sin6_addr)), 16); } if (address && !address->isLocalhost()) { std::map::iterator i = interfaces.insert(std::make_pair(name, NetworkInterface(name, a->ifa_flags & IFF_LOOPBACK))).first; i->second.addAddress(*address); } } freeifaddrs(addrs); #endif std::vector result; for (std::map::const_iterator i = interfaces.begin(); i != interfaces.end(); ++i) { result.push_back(i->second); } return result; } }