GH #147: NetworkInterface (linux): MAC address not always available

This commit is contained in:
Alex 2013-04-23 21:46:57 -05:00
parent 03a1d4dc33
commit c6207985d8
2 changed files with 33 additions and 2 deletions

View File

@ -1277,7 +1277,7 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
ifIndex = sdl->sdl_index;
intf = NetworkInterface(ifIndex);
setInterfaceParams(currIface, intf.impl());
if ((result.find(ifIndex) == result.end()) && ((upOnly && intf.isUp()) || !upOnly) && !ipOnly)
if ((result.find(ifIndex) == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
break;
}
@ -1340,6 +1340,18 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
}
if (ifaces) freeifaddrs(ifaces);
if (ipOnly)
{
Map::iterator it = result.begin();
Map::iterator end = result.end();
for (; it != end;)
{
if (!it->second.supportsIPv4() && !it->second.supportsIPv6())
result.erase(it++);
else ++it;
}
}
return result;
}
@ -1437,7 +1449,7 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
intf = NetworkInterface(ifIndex);
setInterfaceParams(iface, intf.impl());
if ((result.find(ifIndex) == result.end()) && ((upOnly && intf.isUp()) || !upOnly) && !ipOnly)
if ((result.find(ifIndex) == result.end()) && ((upOnly && intf.isUp()) || !upOnly))
ifIt = result.insert(Map::value_type(ifIndex, intf)).first;
break;
@ -1505,6 +1517,18 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly)
if (ifaces) freeifaddrs(ifaces);
if (ipOnly)
{
Map::iterator it = result.begin();
Map::iterator end = result.end();
for (; it != end;)
{
if (!it->second.supportsIPv4() && !it->second.supportsIPv6())
result.erase(it++);
else ++it;
}
}
return result;
#else
throw Poco::NotImplementedException("Not implemented in Android");

View File

@ -194,9 +194,16 @@ void NetworkInterfaceTest::testMapIpOnly()
{
NetworkInterface::Map m = NetworkInterface::map(true, false);
assert (!m.empty());
std::cout << std::endl;
for (NetworkInterface::Map::const_iterator it = m.begin(); it != m.end(); ++it)
{
assert(it->second.supportsIPv4() || it->second.supportsIPv6());
std::cout << "Interface: (" << it->second.index() << ")" << std::endl;
std::cout << "Address: " << it->second.address().toString() << std::endl;
NetworkInterface::MACAddress mac(it->second.macAddress());
if (!mac.empty() && (it->second.type() != NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK))
std::cout << "MAC Address:" << mac << std::endl;
}
}