bool virNWFilterVarValueEqual(const virNWFilterVarValue *a, const virNWFilterVarValue *b) { unsigned int card; size_t 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; }
/* Delete all or a specific IP address from an interface. After this * call either all or the given IP address will not be associated * with the interface anymore. * * @ifname: The name of the (tap) interface * @addr: An IPv4 address in dotted decimal format that the (tap) * interface is not using anymore; provide NULL to remove all IP * addresses associated with the given interface * * This function returns the number of IP addresses that are still * known to be associated with this interface, in case of an error * -1 is returned. Error conditions are: * - IP addresses is not known to be associated with the interface */ int virNWFilterIPAddrMapDelIPAddr(const char *ifname, const char *ipaddr) { int ret = -1; virNWFilterVarValuePtr val = NULL; virMutexLock(&ipAddressMapLock); if (ipaddr != NULL) { val = virHashLookup(ipAddressMap->hashTable, ifname); if (val) { if (virNWFilterVarValueGetCardinality(val) == 1 && STREQ(ipaddr, virNWFilterVarValueGetNthValue(val, 0))) goto remove_entry; virNWFilterVarValueDelValue(val, ipaddr); ret = virNWFilterVarValueGetCardinality(val); } } else { remove_entry: /* remove whole entry */ val = virNWFilterHashTableRemoveEntry(ipAddressMap, ifname); virNWFilterVarValueFree(val); ret = 0; } virMutexUnlock(&ipAddressMapLock); return ret; }
static int virNWFilterVarCombIterAddVariable(virNWFilterVarCombIterEntryPtr cie, virNWFilterHashTablePtr hash, const virNWFilterVarAccess *varAccess) { virNWFilterVarValuePtr varValue; unsigned int maxValue = 0, minValue = 0; const char *varName = virNWFilterVarAccessGetVarName(varAccess); varValue = virHashLookup(hash->hashTable, varName); if (varValue == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not find value for variable '%s'"), varName); return -1; } switch (virNWFilterVarAccessGetType(varAccess)) { case VIR_NWFILTER_VAR_ACCESS_ELEMENT: maxValue = virNWFilterVarAccessGetIndex(varAccess); minValue = maxValue; break; case VIR_NWFILTER_VAR_ACCESS_ITERATOR: maxValue = virNWFilterVarValueGetCardinality(varValue) - 1; minValue = 0; break; case VIR_NWFILTER_VAR_ACCESS_LAST: return -1; } if (cie->nVarNames == 0) { cie->maxValue = maxValue; cie->minValue = minValue; cie->curValue = minValue; } else { if (cie->maxValue != maxValue) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Cardinality of list items must be " "the same for processing them in " "parallel")); return -1; } } if (VIR_EXPAND_N(cie->varNames, cie->nVarNames, 1) < 0) return -1; cie->varNames[cie->nVarNames - 1] = varName; return 0; }