summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Network/UnixNetworkEnvironment.cpp')
-rw-r--r--Swiften/Network/UnixNetworkEnvironment.cpp52
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;