]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: new function virDomainNetPortForwardIsEqual()
authorLaine Stump <laine@redhat.com>
Mon, 12 Jan 2026 20:20:39 +0000 (15:20 -0500)
committerLaine Stump <laine@redhat.com>
Fri, 16 Jan 2026 17:16:33 +0000 (12:16 -0500)
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 <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms

index 9ca5c2450c502641ef1478ca9b9108bb0be05671..d00a43e969a8ca798e335d12e9ad88be4adc33ac 100644 (file)
@@ -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,
index cb35ff06bd19a3178f1e1f11de9619fb1e9c708c..83d49969d3861bdd76bc6d2ad3b75622c0f6c30f 100644 (file)
@@ -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);
index 51f4d6db24d43181b27d5c520acfa681d63cd36f..6bffd2eb6d9edd4e7b571add98a8e40ae1ddf857 100644 (file)
@@ -577,6 +577,7 @@ virDomainNetModelTypeFromString;
 virDomainNetModelTypeToString;
 virDomainNetNotifyActualDevice;
 virDomainNetPortForwardFree;
+virDomainNetPortForwardsIsEqual;
 virDomainNetReleaseActualDevice;
 virDomainNetRemove;
 virDomainNetRemoveByObj;