1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-23 18:55:58 +01:00

Fixed exception thrown when an interface didn't have IP address.

This commit is contained in:
Matias Fontanini
2014-10-23 00:04:20 -05:00
parent 64fac4f255
commit 69440fbc75

View File

@@ -59,10 +59,11 @@ struct InterfaceInfoCollector {
info_type *info;
int iface_id;
const char* iface_name;
bool found;
bool found_hw;
bool found_ip;
InterfaceInfoCollector(info_type *res, int id, const char* if_name)
: info(res), iface_id(id), iface_name(if_name), found(false) { }
: info(res), iface_id(id), iface_name(if_name), found_hw(false), found_ip(false) { }
#ifndef WIN32
bool operator() (const struct ifaddrs *addr) {
@@ -71,8 +72,10 @@ struct InterfaceInfoCollector {
#if defined(BSD) || defined(__FreeBSD_kernel__)
const struct sockaddr_dl* addr_ptr = ((struct sockaddr_dl*)addr->ifa_addr);
if(addr->ifa_addr->sa_family == AF_LINK && addr_ptr->sdl_index == iface_id)
if(addr->ifa_addr->sa_family == AF_LINK && addr_ptr->sdl_index == iface_id) {
info->hw_addr = (const uint8_t*)LLADDR(addr_ptr); // mmmm
found_hw = true;
}
else if(addr->ifa_addr->sa_family == AF_INET && !std::strcmp(addr->ifa_name, iface_name)) {
info->ip_addr = IPv4Address(((struct sockaddr_in *)addr->ifa_addr)->sin_addr.s_addr);
info->netmask = IPv4Address(((struct sockaddr_in *)addr->ifa_netmask)->sin_addr.s_addr);
@@ -80,15 +83,16 @@ struct InterfaceInfoCollector {
info->bcast_addr = IPv4Address(((struct sockaddr_in *)addr->ifa_dstaddr)->sin_addr.s_addr);
else
info->bcast_addr = 0;
found = true;
found_ip = true;
}
return found;
#else
const struct sockaddr_ll* addr_ptr = ((struct sockaddr_ll*)addr->ifa_addr);
if(addr->ifa_addr) {
if(addr->ifa_addr->sa_family == AF_PACKET && addr_ptr->sll_ifindex == iface_id)
if(addr->ifa_addr->sa_family == AF_PACKET && addr_ptr->sll_ifindex == iface_id) {
info->hw_addr = addr_ptr->sll_addr;
found_hw = true;
}
else if(addr->ifa_addr->sa_family == AF_INET && !std::strcmp(addr->ifa_name, iface_name)) {
info->ip_addr = IPv4Address(((struct sockaddr_in *)addr->ifa_addr)->sin_addr.s_addr);
info->netmask = IPv4Address(((struct sockaddr_in *)addr->ifa_netmask)->sin_addr.s_addr);
@@ -96,11 +100,12 @@ struct InterfaceInfoCollector {
info->bcast_addr = IPv4Address(((struct sockaddr_in *)addr->ifa_ifu.ifu_broadaddr)->sin_addr.s_addr);
else
info->bcast_addr = 0;
found = true;
found_ip = true;
}
}
return found;
#endif
return found_ip && found_hw;
}
#else // WIN32
bool operator() (const IP_ADAPTER_ADDRESSES *iface) {
@@ -113,10 +118,11 @@ struct InterfaceInfoCollector {
info->ip_addr = IPv4Address(((const struct sockaddr_in *)unicast->Address.lpSockaddr)->sin_addr.s_addr);
info->netmask = IPv4Address(host_to_be<uint32_t>(0xffffffff << (32 - unicast->OnLinkPrefixLength)));
info->bcast_addr = IPv4Address((info->ip_addr & info->netmask) | ~info->netmask);
found = true;
found_ip = true;
found_hw = true;
}
}
return found;
return found_ip && found_hw;
}
#endif // WIN32
};
@@ -210,8 +216,10 @@ NetworkInterface::Info NetworkInterface::addresses() const {
Info info;
InterfaceInfoCollector collector(&info, iface_id, iface_name.c_str());
Utils::generic_iface_loop(collector);
if(!collector.found)
// If we didn't event get the hw address, this went wrong
if(!collector.found_hw) {
throw std::runtime_error("Error looking up interface address");
}
return info;
}