mirror of https://gitee.com/openkylin/libvirt.git
Remove all use of inet_pton and inet_ntop
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.
This commit is contained in:
parent
640c5f1984
commit
a8ae7d19f4
|
@ -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)
|
||||
|
|
|
@ -627,10 +627,14 @@ learnIPAddressThread(void *arg)
|
|||
|
||||
if (req->status == 0) {
|
||||
int ret;
|
||||
char inetaddr[INET_ADDRSTRLEN];
|
||||
inet_ntop(AF_INET, &vmaddr, inetaddr, sizeof(inetaddr));
|
||||
virSocketAddr sa;
|
||||
sa.len = sizeof(sa.data.inet4);
|
||||
sa.data.inet4.sin_family = AF_INET;
|
||||
sa.data.inet4.sin_addr.s_addr = vmaddr;
|
||||
char *inetaddr;
|
||||
|
||||
virNWFilterAddIpAddrForIfname(req->ifname, strdup(inetaddr));
|
||||
if ((inetaddr = virSocketFormatAddr(&sa))!= NULL) {
|
||||
virNWFilterAddIpAddrForIfname(req->ifname, inetaddr);
|
||||
|
||||
ret = virNWFilterInstantiateFilterLate(NULL,
|
||||
req->ifname,
|
||||
|
@ -643,6 +647,7 @@ learnIPAddressThread(void *arg)
|
|||
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,
|
||||
|
|
|
@ -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,15 +672,13 @@ 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;
|
||||
if (sa.data.sa.sa_family != AF_INET)
|
||||
return EINVAL;
|
||||
|
||||
ifr.ifr_addr = s.sa;
|
||||
ifr.ifr_addr = sa.data.sa;
|
||||
|
||||
if (ioctl(ctl->fd, cmd, &ifr) < 0)
|
||||
return errno;
|
||||
|
@ -692,38 +686,6 @@ brSetInetAddr(brControl *ctl,
|
|||
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)
|
||||
return EINVAL;
|
||||
|
||||
memset(&ifr, 0, sizeof(struct ifreq));
|
||||
|
||||
if (virStrcpyStatic(ifr.ifr_name, ifname) == NULL)
|
||||
return EINVAL;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* brSetInetAddress:
|
||||
* @ctl: bridge control pointer
|
||||
|
@ -745,29 +707,6 @@ brSetInetAddress(brControl *ctl,
|
|||
return brSetInetAddr(ctl, ifname, SIOCSIFADDR, addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
@ -789,30 +728,6 @@ brSetInetNetmask(brControl *ctl,
|
|||
return brSetInetAddr(ctl, ifname, SIOCSIFNETMASK, addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue