The original version of these functions would modify the address sent in, meaning that the caller would usually need to copy the address first. This change makes the original a const, and puts the resulting masked address into a new arg (which could point to the same virSocketAddr as the original, if the caller really wants to modify it). This also makes the API consistent with virSocketAddrBroadcast[ByPrefix]. --- src/util/iptables.c | 3 +-- src/util/network.c | 36 ++++++++++++++++++++++++++---------- src/util/network.h | 10 ++++++---- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/util/iptables.c b/src/util/iptables.c index 647e7ae..6770fe0 100644 --- a/src/util/iptables.c +++ b/src/util/iptables.c @@ -298,8 +298,7 @@ static char *iptablesFormatNetwork(virSocketAddr *netaddr, return NULL; } - network = *netaddr; - if (virSocketAddrMaskByPrefix(&network, prefix) < 0) { + if (virSocketAddrMaskByPrefix(netaddr, prefix, &network) < 0) { iptablesError(VIR_ERR_INTERNAL_ERROR, "%s", _("Failure to mask address")); return NULL; diff --git a/src/util/network.c b/src/util/network.c index f58986e..a7e7423 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -298,23 +298,35 @@ int virSocketAddrIsNetmask(virSocketAddrPtr netmask) { * Returns 0 in case of success, or -1 on error. */ int -virSocketAddrMask(virSocketAddrPtr addr, const virSocketAddrPtr netmask) +virSocketAddrMask(const virSocketAddrPtr addr, + const virSocketAddrPtr netmask, + virSocketAddrPtr network) { - if (addr->data.stor.ss_family != netmask->data.stor.ss_family) + if (addr->data.stor.ss_family != netmask->data.stor.ss_family) { + network->data.stor.ss_family = AF_UNSPEC; return -1; + } if (addr->data.stor.ss_family == AF_INET) { - addr->data.inet4.sin_addr.s_addr - &= netmask->data.inet4.sin_addr.s_addr; + network->data.inet4.sin_addr.s_addr + = (addr->data.inet4.sin_addr.s_addr + & netmask->data.inet4.sin_addr.s_addr); + network->data.stor.ss_family = AF_INET; + network->len = addr->len; return 0; } if (addr->data.stor.ss_family == AF_INET6) { int ii; - for (ii = 0; ii < 16; ii++) - addr->data.inet6.sin6_addr.s6_addr[ii] - &= netmask->data.inet6.sin6_addr.s6_addr[ii]; + for (ii = 0; ii < 16; ii++) { + network->data.inet6.sin6_addr.s6_addr[ii] + = (addr->data.inet6.sin6_addr.s6_addr[ii] + & netmask->data.inet6.sin6_addr.s6_addr[ii]); + } + network->data.stor.ss_family = AF_INET6; + network->len = addr->len; return 0; } + network->data.stor.ss_family = AF_UNSPEC; return -1; } @@ -329,15 +341,19 @@ virSocketAddrMask(virSocketAddrPtr addr, const virSocketAddrPtr netmask) * Returns 0 in case of success, or -1 on error. */ int -virSocketAddrMaskByPrefix(virSocketAddrPtr addr, unsigned int prefix) +virSocketAddrMaskByPrefix(const virSocketAddrPtr addr, + unsigned int prefix, + virSocketAddrPtr network) { virSocketAddr netmask; if (virSocketAddrPrefixToNetmask(prefix, &netmask, - addr->data.stor.ss_family) < 0) + addr->data.stor.ss_family) < 0) { + network->data.stor.ss_family = AF_UNSPEC; return -1; + } - return virSocketAddrMask(addr, &netmask); + return virSocketAddrMask(addr, &netmask, network); } /** diff --git a/src/util/network.h b/src/util/network.h index bcbc607..0b43bf6 100644 --- a/src/util/network.h +++ b/src/util/network.h @@ -73,10 +73,12 @@ int virSocketAddrIsNetmask(virSocketAddrPtr netmask); int virSocketCheckNetmask (virSocketAddrPtr addr1, virSocketAddrPtr addr2, virSocketAddrPtr netmask); -int virSocketAddrMask (virSocketAddrPtr addr, - const virSocketAddrPtr netmask); -int virSocketAddrMaskByPrefix(virSocketAddrPtr addr, - unsigned int prefix); +int virSocketAddrMask (const virSocketAddrPtr addr, + const virSocketAddrPtr netmask, + virSocketAddrPtr network); +int virSocketAddrMaskByPrefix(const virSocketAddrPtr addr, + unsigned int prefix, + virSocketAddrPtr network); int virSocketAddrBroadcast(const virSocketAddrPtr addr, const virSocketAddrPtr netmask, virSocketAddrPtr broadcast); -- 1.7.3.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list