From 2605089c0450c47dc2e696c9be2bb75183d93b91 Mon Sep 17 00:00:00 2001 From: Luyao Huang Date: Mon, 9 Mar 2015 20:04:58 -0400 Subject: [PATCH] util: Update virNetDevGetIPAddress to get IPv6 addresses MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Add static virNetDevGetifaddrsAddress to attempt to get the interface IP address. If getifaddrs is not supported, fall back to virNetDevGetIPv4AddressIoctl to get the IP address. This allows IPv6 addresses to be used for ifa_next) { + int family = ifa->ifa_addr->sa_family; + + if (STRNEQ_NULLABLE(ifa->ifa_name, ifname)) + continue; + if (family != AF_INET6 && family != AF_INET) + continue; + + if (family == AF_INET6) { + addr->len = sizeof(addr->data.inet6); + memcpy(&addr->data.inet6, ifa->ifa_addr, addr->len); + } else { + addr->len = sizeof(addr->data.inet4); + memcpy(&addr->data.inet4, ifa->ifa_addr, addr->len); + } + addr->data.stor.ss_family = family; + ret = 0; + goto cleanup; + } + + virReportError(VIR_ERR_INTERNAL_ERROR, + _("no IP address found for interface '%s'"), + ifname); + cleanup: + freeifaddrs(ifap); + return ret; +} + +#else /* ! HAVE_GETIFADDRS */ + +static int +virNetDevGetifaddrsAddress(const char *ifname ATTRIBUTE_UNUSED, + virSocketAddrPtr addr ATTRIBUTE_UNUSED) +{ + return -2; +} + +#endif + /** * virNetDevGetIPAddress: * @ifname: name of the interface whose IP address we want @@ -1454,6 +1522,9 @@ virNetDevGetIPAddress(const char *ifname, memset(addr, 0, sizeof(*addr)); addr->data.stor.ss_family = AF_UNSPEC; + if ((ret = virNetDevGetifaddrsAddress(ifname, addr)) != -2) + return ret; + if ((ret = virNetDevGetIPv4AddressIoctl(ifname, addr)) != -2) return ret; -- 2.47.2