diff options
Diffstat (limited to 'Swiften/Network/UnixNetworkEnvironment.cpp')
-rw-r--r-- | Swiften/Network/UnixNetworkEnvironment.cpp | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/Swiften/Network/UnixNetworkEnvironment.cpp b/Swiften/Network/UnixNetworkEnvironment.cpp index 649855d..52c5cbe 100644 --- a/Swiften/Network/UnixNetworkEnvironment.cpp +++ b/Swiften/Network/UnixNetworkEnvironment.cpp @@ -4,68 +4,54 @@ * See Documentation/Licenses/BSD-simplified.txt for more information. */ -#include "UnixNetworkEnvironment.h" +#include <Swiften/Network/UnixNetworkEnvironment.h> #include <string> #include <vector> #include <map> - -#include <boost/shared_ptr.hpp> -#include <boost/smart_ptr/make_shared.hpp> -#include <Swiften/Base/boost_bsignals.h> -#include <Swiften/Network/HostAddress.h> -#include <Swiften/Network/NetworkInterface.h> - +#include <boost/optional.hpp> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <net/if.h> #include <ifaddrs.h> +#include <Swiften/Base/boost_bsignals.h> +#include <Swiften/Network/HostAddress.h> +#include <Swiften/Network/NetworkInterface.h> + namespace Swift { -std::vector<NetworkInterface::ref> UnixNetworkEnvironment::getNetworkInterfaces() { - std::map<std::string, UnixNetworkInterface::ref> interfaces; - std::vector<NetworkInterface::ref> result; +std::vector<NetworkInterface> UnixNetworkEnvironment::getNetworkInterfaces() const { + std::map<std::string, NetworkInterface> interfaces; - ifaddrs *addrs = 0; + ifaddrs* addrs = 0; int ret = getifaddrs(&addrs); if (ret != 0) { - return result; + return std::vector<NetworkInterface>(); } - for (ifaddrs *a = addrs; a != 0; a = a->ifa_next) { + for (ifaddrs* a = addrs; a != 0; a = a->ifa_next) { std::string name(a->ifa_name); - std::string ip; + boost::optional<HostAddress> address; if (a->ifa_addr->sa_family == PF_INET) { sockaddr_in* sa = reinterpret_cast<sockaddr_in*>(a->ifa_addr); - char str[INET_ADDRSTRLEN]; - inet_ntop(AF_INET, &(sa->sin_addr), str, INET_ADDRSTRLEN); - ip.assign(str); + address = HostAddress(reinterpret_cast<const unsigned char*>(&(sa->sin_addr)), 4); } else if (a->ifa_addr->sa_family == PF_INET6) { sockaddr_in6* sa = reinterpret_cast<sockaddr_in6*>(a->ifa_addr); - char str[INET6_ADDRSTRLEN]; - /*if (IN6_IS_ADDR_LINKLOCAL(sa)) { - continue; - }*/ - inet_ntop(AF_INET6, &(sa->sin6_addr), str, INET6_ADDRSTRLEN); - ip.assign(str); + address = HostAddress(reinterpret_cast<const unsigned char*>(&(sa->sin6_addr)), 16); } - if (!ip.empty()) { - if (interfaces.find(name) == interfaces.end()) { - interfaces[name] = boost::make_shared<UnixNetworkInterface>(name); - if (a->ifa_flags & IFF_LOOPBACK) { - interfaces[name]->setLoopback(true); - } - } - interfaces[name]->addHostAddress(HostAddress(ip)); + if (address) { + std::map<std::string, NetworkInterface>::iterator i = interfaces.insert(std::make_pair(name, NetworkInterface(name, a->ifa_flags & IFF_LOOPBACK))).first; + i->second.addAddress(*address); } } freeifaddrs(addrs); - for(std::map<std::string, UnixNetworkInterface::ref>::iterator i = interfaces.begin(); i != interfaces.end(); ++i) { + std::vector<NetworkInterface> result; + for (std::map<std::string,NetworkInterface>::const_iterator i = interfaces.begin(); i != interfaces.end(); ++i) { result.push_back(i->second); } return result; |