The inet_pton and inet_ntop functions are obsolete, replaced by getaddrinfo+getnameinfo with the AI_NUMERICHOST flag set. These can be accessed via the virSocket APIs. The bridge.c code had methods for fetching the IP address of a bridge which used inet_ntop. Aside from the use of inet_ntop these methods are broken, because a NIC can have multiple addresses and this only returns one address. Since the methods are never used, just remove them. * src/conf/network_conf.c, src/nwfilter/nwfilter_learnipaddr.c: Replace inet_pton and inet_ntop with virSocket APIs * src/util/bridge.c, src/util/bridge.h: Remove unused methods which called inet_ntop. --- src/conf/network_conf.c | 36 +++++++------- src/nwfilter/nwfilter_learnipaddr.c | 36 +++++++------ src/util/bridge.c | 95 ++--------------------------------- src/util/bridge.h | 8 --- 4 files changed, 43 insertions(+), 132 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index fe52f95..0663d52 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -278,7 +278,7 @@ virNetworkDHCPRangeDefParseXML(virNetworkDefPtr def, xmlStrEqual(cur->name, BAD_CAST "host")) { xmlChar *mac, *name, *ip; unsigned char addr[6]; - struct in_addr inaddress; + virSocketAddr inaddr; mac = xmlGetProp(cur, BAD_CAST "mac"); if ((mac != NULL) && @@ -305,10 +305,7 @@ virNetworkDHCPRangeDefParseXML(virNetworkDefPtr def, continue; } ip = xmlGetProp(cur, BAD_CAST "ip"); - if (inet_pton(AF_INET, (const char *) ip, &inaddress) <= 0) { - virNetworkReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse IP address '%s'"), - ip); + if (virSocketParseAddr((const char *)ip, &inaddr, AF_UNSPEC) < 0) { VIR_FREE(ip); VIR_FREE(mac); VIR_FREE(name); @@ -428,31 +425,34 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt) def->netmask = virXPathString("string(./ip[1]/@netmask)", ctxt); if (def->ipAddress && def->netmask) { - /* XXX someday we want IPv6 too, so inet_aton won't work there */ - struct in_addr inaddress, innetmask; + virSocketAddr inaddress, innetmask; char *netaddr; xmlNodePtr ip; - if (inet_pton(AF_INET, def->ipAddress, &inaddress) <= 0) { - virNetworkReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse IP address '%s'"), - def->ipAddress); + if (virSocketParseAddr(def->ipAddress, &inaddress, AF_UNSPEC) < 0) goto error; - } - if (inet_pton(AF_INET, def->netmask, &innetmask) <= 0) { - virNetworkReportError(VIR_ERR_INTERNAL_ERROR, - _("cannot parse netmask '%s'"), - def->netmask); + if (virSocketParseAddr(def->netmask, &innetmask, AF_UNSPEC) < 0) + goto error; + + /* XXX someday we want IPv6, so will need to relax this */ + if (inaddress.data.sa.sa_family != AF_INET || + innetmask.data.sa.sa_family != AF_INET) { + virNetworkReportError(VIR_ERR_CONFIG_UNSUPPORTED, + "%s", _("Only IPv4 addresses are supported")); goto error; } - inaddress.s_addr &= innetmask.s_addr; - netaddr = inet_ntoa(inaddress); + inaddress.data.inet4.sin_addr.s_addr &= + innetmask.data.inet4.sin_addr.s_addr; + if (!(netaddr = virSocketFormatAddr(&inaddress))) + goto error; if (virAsprintf(&def->network, "%s/%s", netaddr, def->netmask) < 0) { + VIR_FREE(netaddr); virReportOOMError(); goto error; } + VIR_FREE(netaddr); if ((ip = virXPathNode("./ip[1]", ctxt)) && virNetworkIPParseXML(def, ip) < 0) diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c index 7c94fc2..813a205 100644 --- a/src/nwfilter/nwfilter_learnipaddr.c +++ b/src/nwfilter/nwfilter_learnipaddr.c @@ -627,22 +627,26 @@ learnIPAddressThread(void *arg) if (req->status == 0) { int ret; - char inetaddr[INET_ADDRSTRLEN]; - inet_ntop(AF_INET, &vmaddr, inetaddr, sizeof(inetaddr)); - - virNWFilterAddIpAddrForIfname(req->ifname, strdup(inetaddr)); - - ret = virNWFilterInstantiateFilterLate(NULL, - req->ifname, - req->ifindex, - req->linkdev, - req->nettype, - req->macaddr, - req->filtername, - req->filterparams, - req->driver); - VIR_DEBUG("Result from applying firewall rules on " - "%s with IP addr %s : %d\n", req->ifname, inetaddr, ret); + virSocketAddr sa; + sa.len = sizeof(sa.data.inet4); + sa.data.inet4.sin_addr.s_addr = vmaddr; + char *inetaddr; + + if ((inetaddr = virSocketFormatAddr(&sa))!= NULL) { + virNWFilterAddIpAddrForIfname(req->ifname, inetaddr); + + ret = virNWFilterInstantiateFilterLate(NULL, + req->ifname, + req->ifindex, + req->linkdev, + req->nettype, + req->macaddr, + req->filtername, + req->filterparams, + req->driver); + VIR_DEBUG("Result from applying firewall rules on " + "%s with IP addr %s : %d\n", req->ifname, inetaddr, ret); + } } else { if (showError) virReportSystemError(req->status, diff --git a/src/util/bridge.c b/src/util/bridge.c index da62c5e..b4a7e26 100644 --- a/src/util/bridge.c +++ b/src/util/bridge.c @@ -48,6 +48,7 @@ # include "memory.h" # include "util.h" # include "logging.h" +# include "network.h" # define JIFFIES_TO_MS(j) (((j)*1000)/HZ) # define MS_TO_JIFFIES(ms) (((ms)*HZ)/1000) @@ -660,13 +661,8 @@ brSetInetAddr(brControl *ctl, int cmd, const char *addr) { - union { - struct sockaddr sa; - struct sockaddr_in sa_in; - } s; + virSocketAddr sa; struct ifreq ifr; - struct in_addr inaddr; - int ret; if (!ctl || !ctl->fd || !ifname || !addr) return EINVAL; @@ -676,51 +672,17 @@ brSetInetAddr(brControl *ctl, if (virStrcpyStatic(ifr.ifr_name, ifname) == NULL) return EINVAL; - if ((ret = inet_pton(AF_INET, addr, &inaddr)) < 0) - return errno; - else if (ret == 0) + if (virSocketParseAddr(addr, &sa, AF_UNSPEC) < 0) return EINVAL; - s.sa_in.sin_family = AF_INET; - s.sa_in.sin_addr = inaddr; - - ifr.ifr_addr = s.sa; - - if (ioctl(ctl->fd, cmd, &ifr) < 0) - return errno; - - return 0; -} - -static int -brGetInetAddr(brControl *ctl, - const char *ifname, - int cmd, - char *addr, - int maxlen) -{ - struct ifreq ifr; - struct in_addr *inaddr; - - if (!ctl || !ctl->fd || !ifname || !addr) + if (sa.data.sa.sa_family != AF_INET) return EINVAL; - memset(&ifr, 0, sizeof(struct ifreq)); - - if (virStrcpyStatic(ifr.ifr_name, ifname) == NULL) - return EINVAL; + ifr.ifr_addr = sa.data.sa; if (ioctl(ctl->fd, cmd, &ifr) < 0) return errno; - if (maxlen < BR_INET_ADDR_MAXLEN || ifr.ifr_addr.sa_family != AF_INET) - return EFAULT; - - inaddr = &((struct sockaddr_in *)&ifr.ifr_data)->sin_addr; - - if (!inet_ntop(AF_INET, inaddr, addr, maxlen)) - return errno; - return 0; } @@ -746,29 +708,6 @@ brSetInetAddress(brControl *ctl, } /** - * brGetInetAddress: - * @ctl: bridge control pointer - * @ifname: the interface name - * @addr: the array for the string representation of the IP address - * @maxlen: size of @addr in bytes - * - * Function to get the IP address of an interface, it should handle - * IPV4 and IPv6. The returned string for addr would be of the form - * "ddd.ddd.ddd.ddd" assuming the common IPv4 format. - * - * Returns 0 in case of success or an errno code in case of failure. - */ - -int -brGetInetAddress(brControl *ctl, - const char *ifname, - char *addr, - int maxlen) -{ - return brGetInetAddr(ctl, ifname, SIOCGIFADDR, addr, maxlen); -} - -/** * brSetInetNetmask: * @ctl: bridge control pointer * @ifname: the interface name @@ -790,30 +729,6 @@ brSetInetNetmask(brControl *ctl, } /** - * brGetInetNetmask: - * @ctl: bridge control pointer - * @ifname: the interface name - * @addr: the array for the string representation of the netmask - * @maxlen: size of @addr in bytes - * - * Function to get the netmask of an interface, it should handle - * IPV4 and IPv6. The returned string for addr would be of the form - * "ddd.ddd.ddd.ddd" assuming the common IPv4 format. - * - * Returns 0 in case of success or an errno code in case of failure. - */ - -int -brGetInetNetmask(brControl *ctl, - const char *ifname, - char *addr, - int maxlen) -{ - return brGetInetAddr(ctl, ifname, SIOCGIFNETMASK, addr, maxlen); -} - - -/** * brSetForwardDelay: * @ctl: bridge control pointer * @bridge: the bridge name diff --git a/src/util/bridge.h b/src/util/bridge.h index 96696ac..abcd1b5 100644 --- a/src/util/bridge.h +++ b/src/util/bridge.h @@ -85,17 +85,9 @@ int brGetInterfaceUp (brControl *ctl, int brSetInetAddress (brControl *ctl, const char *ifname, const char *addr); -int brGetInetAddress (brControl *ctl, - const char *ifname, - char *addr, - int maxlen); int brSetInetNetmask (brControl *ctl, const char *ifname, const char *netmask); -int brGetInetNetmask (brControl *ctl, - const char *ifname, - char *netmask, - int maxlen); int brSetForwardDelay (brControl *ctl, const char *bridge, -- 1.7.2.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list