Skip to content
Snippets Groups Projects
Commit e243f2ee authored by Tristan Matthews's avatar Tristan Matthews
Browse files

ip_utils: cleanup

Refs #45559
parent e11a8280
No related branches found
No related tags found
No related merge requests found
...@@ -146,18 +146,28 @@ ip_utils::getInterfaceAddr(const std::string &interface, pj_uint16_t family) ...@@ -146,18 +146,28 @@ ip_utils::getInterfaceAddr(const std::string &interface, pj_uint16_t family)
ERROR("getInterfaceAddr: %s %d", interface.c_str(), family); ERROR("getInterfaceAddr: %s %d", interface.c_str(), family);
if (interface == DEFAULT_INTERFACE) if (interface == DEFAULT_INTERFACE)
return getLocalAddr(family); return getLocalAddr(family);
auto unix_family = (family == pj_AF_INET()) ? AF_INET : AF_INET6;
const auto unix_family = family == pj_AF_INET() ? AF_INET : AF_INET6;
int fd = socket(unix_family, SOCK_DGRAM, 0); int fd = socket(unix_family, SOCK_DGRAM, 0);
pj_sockaddr pj_saddr = {};
if (fd < 0) {
ERROR("Could not open socket: %m");
pj_saddr.addr.sa_family = pj_AF_UNSPEC();
return pj_saddr;
}
if (unix_family == AF_INET6) { if (unix_family == AF_INET6) {
int val = (family == pj_AF_UNSPEC()) ? 0 : 1; int val = family != pj_AF_UNSPEC();
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&val, sizeof(val)); if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *) &val, sizeof(val)) < 0) {
ERROR("Could not setsockopt: %m");
close(fd);
return pj_saddr;
} }
pj_sockaddr saddr;
if(fd < 0) {
ERROR("Could not open socket: %m", fd);
saddr.addr.sa_family = pj_AF_UNSPEC();
return saddr;
} }
ifreq ifr; ifreq ifr;
strncpy(ifr.ifr_name, interface.c_str(), sizeof ifr.ifr_name); strncpy(ifr.ifr_name, interface.c_str(), sizeof ifr.ifr_name);
// guarantee that ifr_name is NULL-terminated // guarantee that ifr_name is NULL-terminated
...@@ -171,14 +181,15 @@ ip_utils::getInterfaceAddr(const std::string &interface, pj_uint16_t family) ...@@ -171,14 +181,15 @@ ip_utils::getInterfaceAddr(const std::string &interface, pj_uint16_t family)
sockaddr* unix_addr = &ifr.ifr_addr; sockaddr* unix_addr = &ifr.ifr_addr;
memcpy(&saddr, unix_addr, unix_addr->sa_family == AF_INET6 ? memcpy(&pj_saddr, unix_addr, unix_addr->sa_family == AF_INET6 ?
sizeof saddr.ipv6 : sizeof saddr.ipv4); sizeof pj_saddr.ipv6 : sizeof pj_saddr.ipv4);
if ((ifr.ifr_addr.sa_family == AF_INET && IN_IS_ADDR_UNSPECIFIED(&((sockaddr_in *)unix_addr)->sin_addr )) if ((unix_addr->sa_family == AF_INET and IN_IS_ADDR_UNSPECIFIED(&((sockaddr_in *) unix_addr)->sin_addr))
|| (ifr.ifr_addr.sa_family == AF_INET6 && IN6_IS_ADDR_UNSPECIFIED(&((sockaddr_in6*)unix_addr)->sin6_addr))) { or (unix_addr->sa_family == AF_INET6 and IN6_IS_ADDR_UNSPECIFIED(&((sockaddr_in6*) unix_addr)->sin6_addr))) {
return getLocalAddr(saddr.addr.sa_family); return getLocalAddr(pj_saddr.addr.sa_family);
} }
return saddr;
return pj_saddr;
} }
std::vector<std::string> std::vector<std::string>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment