[libvirt] [PATCH 0/3] nwfilter: Create common virNWFilterObj* APIs

Effectively move code from nwfilter_driver.c into virnwfiltereobj to count the number of devices, to return a list of names, and to return an array of filters. FWIW: This is part of the common driver objects code I've been working through. I figured I will post each driver separately rather than one larger series. John Ferlan (3): nwfilter: Introduce virNWFilterObjNumOfNWFilters nwfilter: Introduce virNWFilterObjGetNames nwfilter: Introduce virNWFilterObjListExport src/conf/virnwfilterobj.c | 104 +++++++++++++++++++++++++++++++++++++++++ src/conf/virnwfilterobj.h | 22 +++++++++ src/libvirt_private.syms | 3 ++ src/nwfilter/nwfilter_driver.c | 86 +++++----------------------------- 4 files changed, 140 insertions(+), 75 deletions(-) -- 2.9.3

Mostly code motion from nwfilter_driver to virnwfilterobj with one caveat to add the virNWFilterObjListFilter typedef and pass it as an 'aclfilter' argument to allow for future possible test driver adjustments to count the number of filters (similar to how node device has done this). Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/conf/virnwfilterobj.c | 20 ++++++++++++++++++++ src/conf/virnwfilterobj.h | 9 +++++++++ src/libvirt_private.syms | 1 + src/nwfilter/nwfilter_driver.c | 15 ++------------- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/conf/virnwfilterobj.c b/src/conf/virnwfilterobj.c index 7e13afb..86d77ce 100644 --- a/src/conf/virnwfilterobj.c +++ b/src/conf/virnwfilterobj.c @@ -305,6 +305,26 @@ virNWFilterObjAssignDef(virNWFilterObjListPtr nwfilters, } +int +virNWFilterObjNumOfNWFilters(virNWFilterObjListPtr nwfilters, + virConnectPtr conn, + virNWFilterObjListFilter aclfilter) +{ + size_t i; + int nfilters = 0; + + for (i = 0; i < nwfilters->count; i++) { + virNWFilterObjPtr obj = nwfilters->objs[i]; + virNWFilterObjLock(obj); + if (aclfilter && aclfilter(conn, obj->def)) + nfilters++; + virNWFilterObjUnlock(obj); + } + + return nfilters; +} + + static virNWFilterObjPtr virNWFilterObjLoadConfig(virNWFilterObjListPtr nwfilters, const char *configDir, diff --git a/src/conf/virnwfilterobj.h b/src/conf/virnwfilterobj.h index 1d80455..a8ecc35 100644 --- a/src/conf/virnwfilterobj.h +++ b/src/conf/virnwfilterobj.h @@ -81,6 +81,15 @@ virNWFilterObjAssignDef(virNWFilterObjListPtr nwfilters, int virNWFilterObjTestUnassignDef(virNWFilterObjPtr nwfilter); +typedef bool +(*virNWFilterObjListFilter)(virConnectPtr conn, + virNWFilterDefPtr def); + +int +virNWFilterObjNumOfNWFilters(virNWFilterObjListPtr nwfilters, + virConnectPtr conn, + virNWFilterObjListFilter aclfilter); + int virNWFilterObjLoadAllConfigs(virNWFilterObjListPtr nwfilters, const char *configDir); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 92083e5..706b2b4 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -962,6 +962,7 @@ virNWFilterObjFindByUUID; virNWFilterObjListFree; virNWFilterObjLoadAllConfigs; virNWFilterObjLock; +virNWFilterObjNumOfNWFilters; virNWFilterObjRemove; virNWFilterObjTestUnassignDef; virNWFilterObjUnlock; diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c index 4ea216a..70bdea2 100644 --- a/src/nwfilter/nwfilter_driver.c +++ b/src/nwfilter/nwfilter_driver.c @@ -414,22 +414,11 @@ nwfilterLookupByName(virConnectPtr conn, static int nwfilterConnectNumOfNWFilters(virConnectPtr conn) { - size_t i; - int n; - if (virConnectNumOfNWFiltersEnsureACL(conn) < 0) return -1; - n = 0; - for (i = 0; i < driver->nwfilters.count; i++) { - virNWFilterObjPtr obj = driver->nwfilters.objs[i]; - virNWFilterObjLock(obj); - if (virConnectNumOfNWFiltersCheckACL(conn, obj->def)) - n++; - virNWFilterObjUnlock(obj); - } - - return n; + return virNWFilterObjNumOfNWFilters(&driver->nwfilters, conn, + virConnectNumOfNWFiltersCheckACL); } -- 2.9.3

Mostly code motion to move nwfilterConnectListNWFilters into nwfilterobj.c and rename to virNWFilterObjGetNames. Also includes a couple of variable name adjustments to keep code consistent with other drivers. Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/conf/virnwfilterobj.c | 34 ++++++++++++++++++++++++++++++++++ src/conf/virnwfilterobj.h | 7 +++++++ src/libvirt_private.syms | 1 + src/nwfilter/nwfilter_driver.c | 29 ++++++----------------------- 4 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/conf/virnwfilterobj.c b/src/conf/virnwfilterobj.c index 86d77ce..66593b8 100644 --- a/src/conf/virnwfilterobj.c +++ b/src/conf/virnwfilterobj.c @@ -325,6 +325,40 @@ virNWFilterObjNumOfNWFilters(virNWFilterObjListPtr nwfilters, } +int +virNWFilterObjGetNames(virNWFilterObjListPtr nwfilters, + virConnectPtr conn, + virNWFilterObjListFilter aclfilter, + char **const names, + int maxnames) +{ + int nnames = 0; + size_t i; + + for (i = 0; i < nwfilters->count && nnames < maxnames; i++) { + virNWFilterObjPtr obj = nwfilters->objs[i]; + virNWFilterObjLock(obj); + if (aclfilter && aclfilter(conn, obj->def)) { + if (VIR_STRDUP(names[nnames], obj->def->name) < 0) { + virNWFilterObjUnlock(obj); + goto failure; + } + nnames++; + } + virNWFilterObjUnlock(obj); + } + + return nnames; + + failure: + while (--nnames >= 0) + VIR_FREE(names[nnames]); + memset(names, 0, maxnames * sizeof(*names)); + + return -1; +} + + static virNWFilterObjPtr virNWFilterObjLoadConfig(virNWFilterObjListPtr nwfilters, const char *configDir, diff --git a/src/conf/virnwfilterobj.h b/src/conf/virnwfilterobj.h index a8ecc35..cd1600c 100644 --- a/src/conf/virnwfilterobj.h +++ b/src/conf/virnwfilterobj.h @@ -91,6 +91,13 @@ virNWFilterObjNumOfNWFilters(virNWFilterObjListPtr nwfilters, virNWFilterObjListFilter aclfilter); int +virNWFilterObjGetNames(virNWFilterObjListPtr nwfilters, + virConnectPtr conn, + virNWFilterObjListFilter aclfilter, + char **const names, + int maxnames); + +int virNWFilterObjLoadAllConfigs(virNWFilterObjListPtr nwfilters, const char *configDir); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 706b2b4..fa1219f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -959,6 +959,7 @@ virNodeDeviceObjUnlock; virNWFilterObjAssignDef; virNWFilterObjFindByName; virNWFilterObjFindByUUID; +virNWFilterObjGetNames; virNWFilterObjListFree; virNWFilterObjLoadAllConfigs; virNWFilterObjLock; diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c index 70bdea2..0d164a2 100644 --- a/src/nwfilter/nwfilter_driver.c +++ b/src/nwfilter/nwfilter_driver.c @@ -425,36 +425,19 @@ nwfilterConnectNumOfNWFilters(virConnectPtr conn) static int nwfilterConnectListNWFilters(virConnectPtr conn, char **const names, - int nnames) + int maxnames) { - int got = 0; - size_t i; + int nnames; if (virConnectListNWFiltersEnsureACL(conn) < 0) return -1; nwfilterDriverLock(); - for (i = 0; i < driver->nwfilters.count && got < nnames; i++) { - virNWFilterObjPtr obj = driver->nwfilters.objs[i]; - virNWFilterObjLock(obj); - if (virConnectListNWFiltersCheckACL(conn, obj->def)) { - if (VIR_STRDUP(names[got], obj->def->name) < 0) { - virNWFilterObjUnlock(obj); - goto cleanup; - } - got++; - } - virNWFilterObjUnlock(obj); - } - nwfilterDriverUnlock(); - return got; - - cleanup: + nnames = virNWFilterObjGetNames(&driver->nwfilters, conn, + virConnectListNWFiltersCheckACL, + names, maxnames); nwfilterDriverUnlock(); - for (i = 0; i < got; i++) - VIR_FREE(names[i]); - memset(names, 0, nnames * sizeof(*names)); - return -1; + return nnames; } -- 2.9.3

Essentially code motion to move the ListExport function from nwfilter_driver into virnwfilterobj Signed-off-by: John Ferlan <jferlan@redhat.com> --- src/conf/virnwfilterobj.c | 50 ++++++++++++++++++++++++++++++++++++++++++ src/conf/virnwfilterobj.h | 6 +++++ src/libvirt_private.syms | 1 + src/nwfilter/nwfilter_driver.c | 42 +++-------------------------------- 4 files changed, 60 insertions(+), 39 deletions(-) diff --git a/src/conf/virnwfilterobj.c b/src/conf/virnwfilterobj.c index 66593b8..e550b22 100644 --- a/src/conf/virnwfilterobj.c +++ b/src/conf/virnwfilterobj.c @@ -359,6 +359,56 @@ virNWFilterObjGetNames(virNWFilterObjListPtr nwfilters, } +int +virNWFilterObjListExport(virConnectPtr conn, + virNWFilterObjListPtr nwfilters, + virNWFilterPtr **filters, + virNWFilterObjListFilter aclfilter) +{ + virNWFilterPtr *tmp_filters = NULL; + int nfilters = 0; + virNWFilterPtr filter = NULL; + virNWFilterObjPtr obj = NULL; + 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); + if (aclfilter && aclfilter(conn, obj->def)) { + if (!(filter = virGetNWFilter(conn, obj->def->name, + obj->def->uuid))) { + virNWFilterObjUnlock(obj); + goto cleanup; + } + tmp_filters[nfilters++] = filter; + } + 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 virNWFilterObjLoadConfig(virNWFilterObjListPtr nwfilters, const char *configDir, diff --git a/src/conf/virnwfilterobj.h b/src/conf/virnwfilterobj.h index cd1600c..49b1170 100644 --- a/src/conf/virnwfilterobj.h +++ b/src/conf/virnwfilterobj.h @@ -98,6 +98,12 @@ virNWFilterObjGetNames(virNWFilterObjListPtr nwfilters, int maxnames); int +virNWFilterObjListExport(virConnectPtr conn, + virNWFilterObjListPtr nwfilters, + virNWFilterPtr **filters, + virNWFilterObjListFilter aclfilter); + +int virNWFilterObjLoadAllConfigs(virNWFilterObjListPtr nwfilters, const char *configDir); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fa1219f..8ecf9d6 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -960,6 +960,7 @@ virNWFilterObjAssignDef; virNWFilterObjFindByName; virNWFilterObjFindByUUID; virNWFilterObjGetNames; +virNWFilterObjListExport; virNWFilterObjListFree; virNWFilterObjLoadAllConfigs; virNWFilterObjLock; diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c index 0d164a2..f6c419c 100644 --- a/src/nwfilter/nwfilter_driver.c +++ b/src/nwfilter/nwfilter_driver.c @@ -446,12 +446,7 @@ nwfilterConnectListAllNWFilters(virConnectPtr conn, virNWFilterPtr **filters, unsigned int flags) { - virNWFilterPtr *tmp_filters = NULL; - int nfilters = 0; - virNWFilterPtr filter = NULL; - virNWFilterObjPtr obj = NULL; - size_t i; - int ret = -1; + int ret; virCheckFlags(0, -1); @@ -459,40 +454,9 @@ nwfilterConnectListAllNWFilters(virConnectPtr conn, return -1; nwfilterDriverLock(); - - if (!filters) { - ret = driver->nwfilters.count; - goto cleanup; - } - - if (VIR_ALLOC_N(tmp_filters, driver->nwfilters.count + 1) < 0) - goto cleanup; - - for (i = 0; i < driver->nwfilters.count; i++) { - obj = driver->nwfilters.objs[i]; - virNWFilterObjLock(obj); - if (virConnectListAllNWFiltersCheckACL(conn, obj->def)) { - if (!(filter = virGetNWFilter(conn, obj->def->name, - obj->def->uuid))) { - virNWFilterObjUnlock(obj); - goto cleanup; - } - tmp_filters[nfilters++] = filter; - } - virNWFilterObjUnlock(obj); - } - - *filters = tmp_filters; - tmp_filters = NULL; - ret = nfilters; - - cleanup: + ret = virNWFilterObjListExport(conn, &driver->nwfilters, filters, + virConnectListAllNWFiltersCheckACL); nwfilterDriverUnlock(); - if (tmp_filters) { - for (i = 0; i < nfilters; i ++) - virObjectUnref(tmp_filters[i]); - } - VIR_FREE(tmp_filters); return ret; } -- 2.9.3

On 04/06/2017 07:36 AM, John Ferlan wrote:
Effectively move code from nwfilter_driver.c into virnwfiltereobj to count the number of devices, to return a list of names, and to return an array of filters.
FWIW: This is part of the common driver objects code I've been working through. I figured I will post each driver separately rather than one larger series.
John Ferlan (3): nwfilter: Introduce virNWFilterObjNumOfNWFilters nwfilter: Introduce virNWFilterObjGetNames nwfilter: Introduce virNWFilterObjListExport
src/conf/virnwfilterobj.c | 104 +++++++++++++++++++++++++++++++++++++++++ src/conf/virnwfilterobj.h | 22 +++++++++ src/libvirt_private.syms | 3 ++ src/nwfilter/nwfilter_driver.c | 86 +++++----------------------------- 4 files changed, 140 insertions(+), 75 deletions(-)
Self NACK... Will update shortly with adjustments for no memset and proper aclfilter check John
participants (1)
-
John Ferlan