From e243f2eefb10dbf2488d177b658264c29268376b Mon Sep 17 00:00:00 2001 From: Tristan Matthews <tristan.matthews@savoirfairelinux.com> Date: Thu, 17 Apr 2014 19:02:08 -0400 Subject: [PATCH] ip_utils: cleanup Refs #45559 --- daemon/src/ip_utils.cpp | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/daemon/src/ip_utils.cpp b/daemon/src/ip_utils.cpp index 7ed0ffa0ea..eba799165e 100644 --- a/daemon/src/ip_utils.cpp +++ b/daemon/src/ip_utils.cpp @@ -146,18 +146,28 @@ ip_utils::getInterfaceAddr(const std::string &interface, pj_uint16_t family) ERROR("getInterfaceAddr: %s %d", interface.c_str(), family); if (interface == DEFAULT_INTERFACE) 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); - if(unix_family == AF_INET6) { - int val = (family == pj_AF_UNSPEC()) ? 0 : 1; - setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&val, sizeof(val)); + + pj_sockaddr pj_saddr = {}; + + if (fd < 0) { + ERROR("Could not open socket: %m"); + pj_saddr.addr.sa_family = pj_AF_UNSPEC(); + 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; + + if (unix_family == AF_INET6) { + int val = family != pj_AF_UNSPEC(); + if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *) &val, sizeof(val)) < 0) { + ERROR("Could not setsockopt: %m"); + close(fd); + return pj_saddr; + } } + ifreq ifr; strncpy(ifr.ifr_name, interface.c_str(), sizeof ifr.ifr_name); // guarantee that ifr_name is NULL-terminated @@ -171,14 +181,15 @@ ip_utils::getInterfaceAddr(const std::string &interface, pj_uint16_t family) sockaddr* unix_addr = &ifr.ifr_addr; - memcpy(&saddr, unix_addr, unix_addr->sa_family == AF_INET6 ? - sizeof saddr.ipv6 : sizeof saddr.ipv4); + memcpy(&pj_saddr, unix_addr, unix_addr->sa_family == AF_INET6 ? + 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 )) - || (ifr.ifr_addr.sa_family == AF_INET6 && IN6_IS_ADDR_UNSPECIFIED(&((sockaddr_in6*)unix_addr)->sin6_addr))) { - return getLocalAddr(saddr.addr.sa_family); + if ((unix_addr->sa_family == AF_INET and IN_IS_ADDR_UNSPECIFIED(&((sockaddr_in *) unix_addr)->sin_addr)) + or (unix_addr->sa_family == AF_INET6 and IN6_IS_ADDR_UNSPECIFIED(&((sockaddr_in6*) unix_addr)->sin6_addr))) { + return getLocalAddr(pj_saddr.addr.sa_family); } - return saddr; + + return pj_saddr; } std::vector<std::string> -- GitLab