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