This function checks two arrays of virDomainNetPortForwards for equality. It seemed silly to send a separate #elements for each array just to check for their equality, but I could easily be convinced to do it that way (rather than having the caller check for equal #element and then just send it once).
Signed-off-by: Laine Stump <[email protected]> --- src/conf/domain_conf.c | 53 ++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 3 +++ src/libvirt_private.syms | 1 + 3 files changed, 57 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9ca5c2450c..d00a43e969 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -21037,6 +21037,59 @@ virDomainNetBackendIsEqual(virDomainNetBackend *src, return true; } +static bool +virDomainNetPortForwardRangeIsEqual(virDomainNetPortForwardRange *r1, + virDomainNetPortForwardRange *r2) +{ + if (!r1 && !r2) + return true; + if (!(r1 && r2)) + return false; + + return (r1->start == r2->start && + r1->end == r2->end && + r1->to == r2->to && + r1->exclude == r2->exclude); +} + + +bool +virDomainNetPortForwardsIsEqual(virDomainNetPortForward **pfs1, + virDomainNetPortForward **pfs2, + size_t npfs) +{ + size_t i; + + if (!pfs1 && !pfs2) + return true; + if (!(pfs1 && pfs2)) + return false; + + for (i = 0; i < npfs; i++) { + virDomainNetPortForward *pf1 = pfs1[0]; + virDomainNetPortForward *pf2 = pfs2[0]; + + if (!pf1 && !pf2) + continue; + if (!(pf1 && pf2)) + return false; + + if (STRNEQ_NULLABLE(pf1->dev, pf2->dev) || + pf1->proto != pf2->proto || + !virSocketAddrEqual(&pf1->address, &pf2->address) || + pf1->nRanges != pf2->nRanges) { + return false; + } + + for (i = 0; i < pf1->nRanges; i++) { + if (!virDomainNetPortForwardRangeIsEqual(pf1->ranges[i], pf2->ranges[i])) + return false; + } + } + + return true; +} + static bool virDomainNetDefCheckABIStability(virDomainNetDef *src, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index cb35ff06bd..83d49969d3 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -4099,6 +4099,9 @@ void virDomainNetInsert(virDomainDef *def, virDomainNetDef *net); void virDomainNetUpdate(virDomainDef *def, size_t netidx, virDomainNetDef *newnet); bool virDomainNetBackendIsEqual(virDomainNetBackend *src, virDomainNetBackend *dst); +bool virDomainNetPortForwardsIsEqual(virDomainNetPortForward **pfs1, + virDomainNetPortForward **pfs2, + size_t npfs); int virDomainNetDHCPInterfaces(virDomainDef *def, virDomainInterfacePtr **ifaces); int virDomainNetARPInterfaces(virDomainDef *def, virDomainInterfacePtr **ifaces); virDomainNetDef *virDomainNetRemove(virDomainDef *def, size_t i); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4e57e4a8f6..ab2ab8afd2 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -577,6 +577,7 @@ virDomainNetModelTypeFromString; virDomainNetModelTypeToString; virDomainNetNotifyActualDevice; virDomainNetPortForwardFree; +virDomainNetPortForwardsIsEqual; virDomainNetReleaseActualDevice; virDomainNetRemove; virDomainNetRemoveByObj; -- 2.52.0
