mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-23 03:42:19 +00:00
Improve virSocketAddrMask[ByPrefix] API
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].
This commit is contained in:
parent
2eeeb60152
commit
77094eaf3a
@ -298,8 +298,7 @@ static char *iptablesFormatNetwork(virSocketAddr *netaddr,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
network = *netaddr;
|
if (virSocketAddrMaskByPrefix(netaddr, prefix, &network) < 0) {
|
||||||
if (virSocketAddrMaskByPrefix(&network, prefix) < 0) {
|
|
||||||
iptablesError(VIR_ERR_INTERNAL_ERROR, "%s",
|
iptablesError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("Failure to mask address"));
|
_("Failure to mask address"));
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -298,23 +298,35 @@ int virSocketAddrIsNetmask(virSocketAddrPtr netmask) {
|
|||||||
* Returns 0 in case of success, or -1 on error.
|
* Returns 0 in case of success, or -1 on error.
|
||||||
*/
|
*/
|
||||||
int
|
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;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (addr->data.stor.ss_family == AF_INET) {
|
if (addr->data.stor.ss_family == AF_INET) {
|
||||||
addr->data.inet4.sin_addr.s_addr
|
network->data.inet4.sin_addr.s_addr
|
||||||
&= netmask->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;
|
return 0;
|
||||||
}
|
}
|
||||||
if (addr->data.stor.ss_family == AF_INET6) {
|
if (addr->data.stor.ss_family == AF_INET6) {
|
||||||
int ii;
|
int ii;
|
||||||
for (ii = 0; ii < 16; ii++)
|
for (ii = 0; ii < 16; ii++) {
|
||||||
addr->data.inet6.sin6_addr.s6_addr[ii]
|
network->data.inet6.sin6_addr.s6_addr[ii]
|
||||||
&= netmask->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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
network->data.stor.ss_family = AF_UNSPEC;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,15 +341,19 @@ virSocketAddrMask(virSocketAddrPtr addr, const virSocketAddrPtr netmask)
|
|||||||
* Returns 0 in case of success, or -1 on error.
|
* Returns 0 in case of success, or -1 on error.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
virSocketAddrMaskByPrefix(virSocketAddrPtr addr, unsigned int prefix)
|
virSocketAddrMaskByPrefix(const virSocketAddrPtr addr,
|
||||||
|
unsigned int prefix,
|
||||||
|
virSocketAddrPtr network)
|
||||||
{
|
{
|
||||||
virSocketAddr netmask;
|
virSocketAddr netmask;
|
||||||
|
|
||||||
if (virSocketAddrPrefixToNetmask(prefix, &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 -1;
|
||||||
|
}
|
||||||
|
|
||||||
return virSocketAddrMask(addr, &netmask);
|
return virSocketAddrMask(addr, &netmask, network);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -73,10 +73,12 @@ int virSocketAddrIsNetmask(virSocketAddrPtr netmask);
|
|||||||
int virSocketCheckNetmask (virSocketAddrPtr addr1,
|
int virSocketCheckNetmask (virSocketAddrPtr addr1,
|
||||||
virSocketAddrPtr addr2,
|
virSocketAddrPtr addr2,
|
||||||
virSocketAddrPtr netmask);
|
virSocketAddrPtr netmask);
|
||||||
int virSocketAddrMask (virSocketAddrPtr addr,
|
int virSocketAddrMask (const virSocketAddrPtr addr,
|
||||||
const virSocketAddrPtr netmask);
|
const virSocketAddrPtr netmask,
|
||||||
int virSocketAddrMaskByPrefix(virSocketAddrPtr addr,
|
virSocketAddrPtr network);
|
||||||
unsigned int prefix);
|
int virSocketAddrMaskByPrefix(const virSocketAddrPtr addr,
|
||||||
|
unsigned int prefix,
|
||||||
|
virSocketAddrPtr network);
|
||||||
int virSocketAddrBroadcast(const virSocketAddrPtr addr,
|
int virSocketAddrBroadcast(const virSocketAddrPtr addr,
|
||||||
const virSocketAddrPtr netmask,
|
const virSocketAddrPtr netmask,
|
||||||
virSocketAddrPtr broadcast);
|
virSocketAddrPtr broadcast);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user