int virNWFilterObjListGetNames(virNWFilterObjListPtr nwfilters, virConnectPtr conn, virNWFilterObjListFilter filter, char **const names, int maxnames) { int nnames = 0; size_t i; virNWFilterDefPtr def; for (i = 0; i < nwfilters->count && nnames < maxnames; i++) { virNWFilterObjPtr obj = nwfilters->objs[i]; virNWFilterObjLock(obj); def = obj->def; if (!filter || filter(conn, def)) { if (VIR_STRDUP(names[nnames], def->name) < 0) { virNWFilterObjUnlock(obj); goto failure; } nnames++; } virNWFilterObjUnlock(obj); } return nnames; failure: while (--nnames >= 0) VIR_FREE(names[nnames]); return -1; }
static int nwfilterListNWFilters(virConnectPtr conn, char **const names, int nnames) { virNWFilterDriverStatePtr driver = conn->nwfilterPrivateData; int got = 0, i; nwfilterDriverLock(driver); for (i = 0 ; i < driver->nwfilters.count && got < nnames ; i++) { virNWFilterObjLock(driver->nwfilters.objs[i]); if (!(names[got] = strdup(driver->nwfilters.objs[i]->def->name))) { virNWFilterObjUnlock(driver->nwfilters.objs[i]); virReportOOMError(); goto cleanup; } got++; virNWFilterObjUnlock(driver->nwfilters.objs[i]); } nwfilterDriverUnlock(driver); return got; cleanup: nwfilterDriverUnlock(driver); for (i = 0 ; i < got ; i++) VIR_FREE(names[i]); memset(names, 0, nnames * sizeof(*names)); return -1; }
int virNWFilterObjListExport(virConnectPtr conn, virNWFilterObjListPtr nwfilters, virNWFilterPtr **filters, virNWFilterObjListFilter filter) { virNWFilterPtr *tmp_filters = NULL; int nfilters = 0; virNWFilterPtr nwfilter = NULL; virNWFilterObjPtr obj = NULL; virNWFilterDefPtr def; size_t i; int ret = -1; if (!filters) { ret = nwfilters->count; goto cleanup; } if (VIR_ALLOC_N(tmp_filters, nwfilters->count + 1) < 0) goto cleanup; for (i = 0; i < nwfilters->count; i++) { obj = nwfilters->objs[i]; virNWFilterObjLock(obj); def = obj->def; if (!filter || filter(conn, def)) { if (!(nwfilter = virGetNWFilter(conn, def->name, def->uuid))) { virNWFilterObjUnlock(obj); goto cleanup; } tmp_filters[nfilters++] = nwfilter; } virNWFilterObjUnlock(obj); } *filters = tmp_filters; tmp_filters = NULL; ret = nfilters; cleanup: if (tmp_filters) { for (i = 0; i < nfilters; i ++) virObjectUnref(tmp_filters[i]); } VIR_FREE(tmp_filters); return ret; }
static virNWFilterObjPtr virNWFilterObjNew(void) { virNWFilterObjPtr obj; if (VIR_ALLOC(obj) < 0) return NULL; if (virMutexInitRecursive(&obj->lock) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize mutex")); VIR_FREE(obj); return NULL; } virNWFilterObjLock(obj); return obj; }
int virNWFilterObjListNumOfNWFilters(virNWFilterObjListPtr nwfilters, virConnectPtr conn, virNWFilterObjListFilter filter) { size_t i; int nfilters = 0; for (i = 0; i < nwfilters->count; i++) { virNWFilterObjPtr obj = nwfilters->objs[i]; virNWFilterObjLock(obj); if (!filter || filter(conn, obj->def)) nfilters++; virNWFilterObjUnlock(obj); } return nfilters; }
virNWFilterObjPtr virNWFilterObjListFindByName(virNWFilterObjListPtr nwfilters, const char *name) { size_t i; virNWFilterObjPtr obj; virNWFilterDefPtr def; for (i = 0; i < nwfilters->count; i++) { obj = nwfilters->objs[i]; virNWFilterObjLock(obj); def = obj->def; if (STREQ_NULLABLE(def->name, name)) return obj; virNWFilterObjUnlock(obj); } return NULL; }
virNWFilterObjPtr virNWFilterObjListFindByUUID(virNWFilterObjListPtr nwfilters, const unsigned char *uuid) { size_t i; virNWFilterObjPtr obj; virNWFilterDefPtr def; for (i = 0; i < nwfilters->count; i++) { obj = nwfilters->objs[i]; virNWFilterObjLock(obj); def = obj->def; if (!memcmp(def->uuid, uuid, VIR_UUID_BUFLEN)) return obj; virNWFilterObjUnlock(obj); } return NULL; }
void virNWFilterObjListRemove(virNWFilterObjListPtr nwfilters, virNWFilterObjPtr obj) { size_t i; virNWFilterObjUnlock(obj); for (i = 0; i < nwfilters->count; i++) { virNWFilterObjLock(nwfilters->objs[i]); if (nwfilters->objs[i] == obj) { virNWFilterObjUnlock(nwfilters->objs[i]); virNWFilterObjFree(nwfilters->objs[i]); VIR_DELETE_ELEMENT(nwfilters->objs, i, nwfilters->count); break; } virNWFilterObjUnlock(nwfilters->objs[i]); } }