fix(network): Connection state

Closes jaagr/lemonbuddy#118
This commit is contained in:
Michael Carlberg 2016-10-29 07:19:32 +02:00
parent 072f836a58
commit 2768041d7c

View File

@ -174,16 +174,8 @@ namespace net {
/** /**
* Test if the network interface is in a valid state * Test if the network interface is in a valid state
*/ */
bool test_interface(struct ifreq& request) const { bool test_interface() const {
if ((ioctl(m_socketfd, SIOCGIFFLAGS, &request)) == -1)
return false;
if ((request.ifr_flags & IFF_UP) == 0)
return false;
if ((request.ifr_flags & IFF_RUNNING) == 0)
return false;
auto operstate = file_util::get_contents("/sys/class/net/" + m_interface + "/operstate"); auto operstate = file_util::get_contents("/sys/class/net/" + m_interface + "/operstate");
return operstate.compare(0, 2, "up") == 0; return operstate.compare(0, 2, "up") == 0;
} }
@ -246,6 +238,9 @@ namespace net {
* Check current connection state * Check current connection state
*/ */
bool connected() const override { bool connected() const override {
if (!network::test_interface())
return false;
struct ifreq request; struct ifreq request;
struct ethtool_value ethernet_data; struct ethtool_value ethernet_data;
@ -253,9 +248,6 @@ namespace net {
ethernet_data.cmd = ETHTOOL_GLINK; ethernet_data.cmd = ETHTOOL_GLINK;
request.ifr_data = reinterpret_cast<caddr_t>(&ethernet_data); request.ifr_data = reinterpret_cast<caddr_t>(&ethernet_data);
if (!network::test_interface(request))
return false;
if (ioctl(m_socketfd, SIOCETHTOOL, &request) != -1) if (ioctl(m_socketfd, SIOCETHTOOL, &request) != -1)
return ethernet_data.data != 0; return ethernet_data.data != 0;
@ -315,10 +307,13 @@ namespace net {
* Check current connection state * Check current connection state
*/ */
bool connected() const override { bool connected() const override {
if (!network::test_interface())
return false;
struct ifreq request; struct ifreq request;
strncpy(request.ifr_name, m_interface.c_str(), IFNAMSIZ - 1); strncpy(request.ifr_name, m_interface.c_str(), IFNAMSIZ - 1);
if (!network::test_interface(request)) if ((ioctl(m_socketfd, SIOCGIFFLAGS, &request)) == -1)
return false; return false;
if (m_essid.empty()) if (m_essid.empty())
return false; return false;