]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
nwfilter: utility function virNWFilterVarValueEqual
authorStefan Berger <stefanb@us.ibm.com>
Thu, 29 Nov 2012 17:49:32 +0000 (12:49 -0500)
committerLaine Stump <laine@laine.org>
Mon, 3 Dec 2012 19:35:58 +0000 (14:35 -0500)
To detect if an interface's nwfilter has changed, we need to also
compare the filterparams, which is a hashtable of virNWFilterVarValue.
virHashEqual can do this nicely, but requires a pointer to a function
that will compare two of the items being stored in the hashes.

src/conf/nwfilter_params.c
src/conf/nwfilter_params.h
src/libvirt_private.syms

index 6dc4baad424dc4f25f0b410e4b7367187799e8f3..3ac130390b6a10b6b42b0bd4de9d62d2e81e8561 100644 (file)
@@ -189,6 +189,37 @@ virNWFilterVarValueGetCardinality(const virNWFilterVarValuePtr val)
     return 0;
 }
 
+bool
+virNWFilterVarValueEqual(const virNWFilterVarValuePtr a,
+                         const virNWFilterVarValuePtr b)
+{
+    unsigned int card, i, j;
+    const char *s;
+
+    if (!a || !b)
+        return false;
+
+    card = virNWFilterVarValueGetCardinality(a);
+    if (card != virNWFilterVarValueGetCardinality(b))
+        return false;
+
+    /* brute force O(n^2) comparison */
+    for (i = 0; i < card; i++) {
+        bool eq = false;
+
+        s = virNWFilterVarValueGetNthValue(a, i);
+        for (j = 0; j < card; j++) {
+            if (STREQ_NULLABLE(s, virNWFilterVarValueGetNthValue(b, j))) {
+                 eq = true;
+                 break;
+            }
+        }
+        if (!eq)
+            return false;
+    }
+    return true;
+}
+
 int
 virNWFilterVarValueAddValue(virNWFilterVarValuePtr val, char *value)
 {
index cedf9cd9922ef1c06b60a9e1f06bf69fa5a2c204..96d3033ecbd2ff2ef38086e42ad26b05382725db 100644 (file)
@@ -57,6 +57,8 @@ const char *virNWFilterVarValueGetSimple(const virNWFilterVarValuePtr val);
 const char *virNWFilterVarValueGetNthValue(virNWFilterVarValuePtr val,
                                            unsigned int idx);
 unsigned int virNWFilterVarValueGetCardinality(const virNWFilterVarValuePtr);
+bool virNWFilterVarValueEqual(const virNWFilterVarValuePtr a,
+                              const virNWFilterVarValuePtr b);
 int virNWFilterVarValueAddValue(virNWFilterVarValuePtr val, char *value);
 int virNWFilterVarValueDelValue(virNWFilterVarValuePtr val, const char *value);
 
index 08974d0c4407e83d53741d3302a296d36e283f62..51c76a549b8eb95da32ec5904b066ac090b4f733 100644 (file)
@@ -975,6 +975,7 @@ virNWFilterVarValueCopy;
 virNWFilterVarValueCreateSimple;
 virNWFilterVarValueCreateSimpleCopyValue;
 virNWFilterVarValueDelValue;
+virNWFilterVarValueEqual;
 virNWFilterVarValueFree;
 virNWFilterVarValueGetCardinality;
 virNWFilterVarValueGetNthValue;