diff --git a/networkinterface.hpp b/networkinterface.hpp index 24a9abb..ec41cb7 100644 --- a/networkinterface.hpp +++ b/networkinterface.hpp @@ -10,6 +10,7 @@ #define NETWORKINTERFACE_HPP #include +#include class NetworkInterface { @@ -24,6 +25,7 @@ class NetworkInterface virtual bool is_wireless() const = 0; virtual std::string ssid() const = 0; + virtual std::vector resolvers() const = 0; }; #endif diff --git a/networkmanager.cpp b/networkmanager.cpp index 13cc0df..9ade9ca 100644 --- a/networkmanager.cpp +++ b/networkmanager.cpp @@ -45,3 +45,7 @@ int NetworkMgr::getState(bool reportNoChange) std::vector NetworkMgr::getRunningNetworks() { return getNetworks(); } + +std::vector NetworkMgr::getNetworkResolvers(const std::string& network) { + return getResolvers(network); +} diff --git a/networkmanager.h b/networkmanager.h index 7e265c4..0049f57 100644 --- a/networkmanager.h +++ b/networkmanager.h @@ -38,6 +38,7 @@ class NetworkMgr : public QObject int getState(bool reportNoChange); virtual int testQuery() = 0; std::vector getRunningNetworks(); + std::vector getNetworkResolvers(const std::string& network); signals: void networkConfigChanged(); @@ -49,6 +50,7 @@ class NetworkMgr : public QObject virtual int unsetLocalhostDNS() = 0; virtual int getStateDNS(bool reportNoChange) = 0; virtual std::vector getNetworks() = 0; + virtual std::vector getResolvers(const std::string& network) = 0; MainWindow *m_mainwindow; NetworkState m_networkState; diff --git a/os/windows/networkinterface_windows.cpp b/os/windows/networkinterface_windows.cpp index 53ae08c..7520f87 100644 --- a/os/windows/networkinterface_windows.cpp +++ b/os/windows/networkinterface_windows.cpp @@ -17,12 +17,14 @@ NetworkInterfaceWindows::NetworkInterfaceWindows( const std::string& description, const std::string& dns_suffix, const std::string& ssid, + const std::vector& resolvers, bool is_resolver_loopback, bool is_running, DWORD if_type, IF_OPER_STATUS oper_status) : name_(name), adapter_name_(adapter_name), - description_(description), dns_suffix_(dns_suffix), ssid_(ssid), + description_(description), dns_suffix_(dns_suffix), + ssid_(ssid), resolvers_(resolvers), is_resolver_loopback_(is_resolver_loopback), is_running_(is_running), if_type_(if_type), @@ -55,8 +57,12 @@ bool NetworkInterfaceWindows::is_wireless() const return if_type_ == IF_TYPE_IEEE80211; } - std::string NetworkInterfaceWindows::ssid() const { return ssid_; } + +std::vector NetworkInterfaceWindows::resolvers() const +{ + return resolvers_; +} diff --git a/os/windows/networkinterface_windows.hpp b/os/windows/networkinterface_windows.hpp index b859d4e..34dad5f 100644 --- a/os/windows/networkinterface_windows.hpp +++ b/os/windows/networkinterface_windows.hpp @@ -23,6 +23,7 @@ class NetworkInterfaceWindows : public NetworkInterface const std::string& descripton, const std::string& dns_suffix, const std::string& ssid, + const std::vector& resolvers, bool is_resolver_loopback, bool is_running, DWORD if_type, @@ -37,6 +38,7 @@ class NetworkInterfaceWindows : public NetworkInterface bool is_wireless() const override; virtual std::string ssid() const override; + virtual std::vector resolvers() const override; private: std::string name_; @@ -44,6 +46,7 @@ class NetworkInterfaceWindows : public NetworkInterface std::string description_; std::string dns_suffix_; std::string ssid_; + std::vector resolvers_; bool is_resolver_loopback_; bool is_running_; DWORD if_type_; diff --git a/os/windows/networkmanager_windows.cpp b/os/windows/networkmanager_windows.cpp index 9cb2386..e6b27e1 100644 --- a/os/windows/networkmanager_windows.cpp +++ b/os/windows/networkmanager_windows.cpp @@ -306,7 +306,7 @@ int NetworkMgrWindows::getStateDNS(bool reportNoChange) m_networkState = NotLocalhost; if (oldNetworkState != m_networkState || reportNoChange == true) m_mainwindow->statusMsg("Status: DNS settings NOT using localhost."); - emit networkStateChanged(NotLocalhost); + emit networkStateChanged(NotLocalhost); } return 0; } @@ -358,6 +358,7 @@ void NetworkMgrWindows::reload() bool resolver_loopback = true; bool running = false; + std::vector resolvers; // We consider the interface up if it is reported as // up AND there is a non-link-local address allocated. @@ -384,7 +385,11 @@ void NetworkMgrWindows::reload() if ( !dns_addr.isLoopback() ) { resolver_loopback = false; - break; + + // Resolver addresses can be duplicated. + std::string resolver = dns_addr.toString(); + if ( std::find(resolvers.begin(), resolvers.end(), resolver) == resolvers.end() ) + resolvers.push_back(resolver); } } @@ -405,6 +410,7 @@ void NetworkMgrWindows::reload() description, dns_suffix, ssid, + resolvers, resolver_loopback, running, adapter->IfType, @@ -485,6 +491,20 @@ std::vector NetworkMgrWindows::getNetworks() return res; } +std::vector NetworkMgrWindows::getResolvers(const std::string& network) +{ + std::vector res; + + for ( const auto& i: interfaces ) + if ( i.name() == network ) + { + res = i.resolvers(); + break; + } + + return res; +} + int NetworkMgrWindows::testQuery() { m_testQuery->start(); return 0; diff --git a/os/windows/networkmanager_windows.h b/os/windows/networkmanager_windows.h index 8c3c9e9..ea38f4b 100644 --- a/os/windows/networkmanager_windows.h +++ b/os/windows/networkmanager_windows.h @@ -42,6 +42,7 @@ class NetworkMgrWindows : public NetworkMgr int getStateDNS(bool reportChange); int testQuery() override; std::vector getNetworks(); + std::vector getResolvers(const std::string& network); private slots: void on_testQuery_finished(int exitCode, QProcess::ExitStatus exitStatus);