From: Stefan Berger Date: Thu, 29 Nov 2012 17:49:32 +0000 (-0500) Subject: nwfilter: utility function virNWFilterVarValueEqual X-Git-Tag: v1.0.1-rc1~100 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab4139a4932aecef09bcac1d8764938b047bcfc6;p=thirdparty%2Flibvirt.git nwfilter: utility function virNWFilterVarValueEqual 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. --- diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c index 6dc4baad42..3ac130390b 100644 --- a/src/conf/nwfilter_params.c +++ b/src/conf/nwfilter_params.c @@ -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) { diff --git a/src/conf/nwfilter_params.h b/src/conf/nwfilter_params.h index cedf9cd992..96d3033ecb 100644 --- a/src/conf/nwfilter_params.h +++ b/src/conf/nwfilter_params.h @@ -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); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 08974d0c44..51c76a549b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -975,6 +975,7 @@ virNWFilterVarValueCopy; virNWFilterVarValueCreateSimple; virNWFilterVarValueCreateSimpleCopyValue; virNWFilterVarValueDelValue; +virNWFilterVarValueEqual; virNWFilterVarValueFree; virNWFilterVarValueGetCardinality; virNWFilterVarValueGetNthValue;