mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-27 19:11:16 +00:00
conf: introduce a virNWFilterBindingObjListPtr struct
Introduce a new struct to act as the manager of a collection of virNWFilterBindingObjPtr objects. Reviewed-by: John Ferlan <jferlan@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
191b4396d3
commit
c21679fa3f
@ -89,6 +89,8 @@ NWFILTER_CONF_SOURCES = \
|
|||||||
conf/virnwfilterbindingdef.h \
|
conf/virnwfilterbindingdef.h \
|
||||||
conf/virnwfilterbindingobj.c \
|
conf/virnwfilterbindingobj.c \
|
||||||
conf/virnwfilterbindingobj.h \
|
conf/virnwfilterbindingobj.h \
|
||||||
|
conf/virnwfilterbindingobjlist.c \
|
||||||
|
conf/virnwfilterbindingobjlist.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
STORAGE_CONF_SOURCES = \
|
STORAGE_CONF_SOURCES = \
|
||||||
|
@ -207,7 +207,7 @@ virNWFilterBindingObjParseXML(xmlDocPtr doc,
|
|||||||
if (!(ret = virNWFilterBindingObjNew()))
|
if (!(ret = virNWFilterBindingObjNew()))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!(node = virXPathNode("./filterbindingstatus", ctxt))) {
|
if (!(node = virXPathNode("./filterbinding", ctxt))) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("filter binding status missing content"));
|
_("filter binding status missing content"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -231,9 +231,10 @@ virNWFilterBindingObjParseNode(xmlDocPtr doc,
|
|||||||
xmlXPathContextPtr ctxt = NULL;
|
xmlXPathContextPtr ctxt = NULL;
|
||||||
virNWFilterBindingObjPtr obj = NULL;
|
virNWFilterBindingObjPtr obj = NULL;
|
||||||
|
|
||||||
if (STRNEQ((const char *)root->name, "filterbinding")) {
|
if (STRNEQ((const char *)root->name, "filterbindingstatus")) {
|
||||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
virReportError(VIR_ERR_XML_ERROR,
|
||||||
_("unknown root element for filter binding"));
|
_("unknown root element '%s' for filter binding"),
|
||||||
|
root->name);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
487
src/conf/virnwfilterbindingobjlist.c
Normal file
487
src/conf/virnwfilterbindingobjlist.c
Normal file
@ -0,0 +1,487 @@
|
|||||||
|
/*
|
||||||
|
* virnwfilterbindingobjlist.c: nwfilter binding object list utilities
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
#include "datatypes.h"
|
||||||
|
#include "virnwfilterbindingobjlist.h"
|
||||||
|
#include "viralloc.h"
|
||||||
|
#include "virfile.h"
|
||||||
|
#include "virlog.h"
|
||||||
|
#include "virstring.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_NWFILTER
|
||||||
|
|
||||||
|
VIR_LOG_INIT("conf.virnwfilterbindingobjlist");
|
||||||
|
|
||||||
|
static virClassPtr virNWFilterBindingObjListClass;
|
||||||
|
static void virNWFilterBindingObjListDispose(void *obj);
|
||||||
|
|
||||||
|
struct _virNWFilterBindingObjList {
|
||||||
|
virObjectRWLockable parent;
|
||||||
|
|
||||||
|
/* port dev name -> virNWFilterBindingObj mapping
|
||||||
|
* for O(1), lockless lookup-by-port dev */
|
||||||
|
virHashTable *objs;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int virNWFilterBindingObjListOnceInit(void)
|
||||||
|
{
|
||||||
|
if (!VIR_CLASS_NEW(virNWFilterBindingObjList, virClassForObjectRWLockable()))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_ONCE_GLOBAL_INIT(virNWFilterBindingObjList)
|
||||||
|
|
||||||
|
|
||||||
|
virNWFilterBindingObjListPtr
|
||||||
|
virNWFilterBindingObjListNew(void)
|
||||||
|
{
|
||||||
|
virNWFilterBindingObjListPtr bindings;
|
||||||
|
|
||||||
|
if (virNWFilterBindingObjListInitialize() < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!(bindings = virObjectRWLockableNew(virNWFilterBindingObjListClass)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!(bindings->objs = virHashCreate(50, virObjectFreeHashData))) {
|
||||||
|
virObjectUnref(bindings);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bindings;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
virNWFilterBindingObjListDispose(void *obj)
|
||||||
|
{
|
||||||
|
virNWFilterBindingObjListPtr bindings = obj;
|
||||||
|
|
||||||
|
virHashFree(bindings->objs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static virNWFilterBindingObjPtr
|
||||||
|
virNWFilterBindingObjListFindByPortDevLocked(virNWFilterBindingObjListPtr bindings,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
virNWFilterBindingObjPtr obj;
|
||||||
|
|
||||||
|
obj = virHashLookup(bindings->objs, name);
|
||||||
|
virObjectRef(obj);
|
||||||
|
if (obj) {
|
||||||
|
virObjectLock(obj);
|
||||||
|
if (virNWFilterBindingObjGetRemoving(obj)) {
|
||||||
|
virObjectUnlock(obj);
|
||||||
|
virObjectUnref(obj);
|
||||||
|
obj = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @bindings: NWFilterBinding object list
|
||||||
|
* @name: Name to search the bindings->objs table
|
||||||
|
*
|
||||||
|
* Lookup the @name in the bindings->objs hash table and return a
|
||||||
|
* locked and ref counted binding object if found. Caller is expected
|
||||||
|
* to use the virNWFilterBindingObjEndAPI when done with the object.
|
||||||
|
*/
|
||||||
|
virNWFilterBindingObjPtr
|
||||||
|
virNWFilterBindingObjListFindByPortDev(virNWFilterBindingObjListPtr bindings,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
virNWFilterBindingObjPtr obj;
|
||||||
|
|
||||||
|
virObjectRWLockRead(bindings);
|
||||||
|
obj = virNWFilterBindingObjListFindByPortDevLocked(bindings, name);
|
||||||
|
virObjectRWUnlock(bindings);
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @bindings: NWFilterBinding object list pointer
|
||||||
|
* @binding: NWFilterBinding object to be added
|
||||||
|
*
|
||||||
|
* Upon entry @binding should have at least 1 ref and be locked.
|
||||||
|
*
|
||||||
|
* Add the @binding into the @bindings->objs hash
|
||||||
|
* tables. Once successfully added into a table, increase the
|
||||||
|
* reference count since upon removal in virHashRemoveEntry
|
||||||
|
* the virObjectUnref will be called since the hash tables were
|
||||||
|
* configured to call virObjectFreeHashData when the object is
|
||||||
|
* removed from the hash table.
|
||||||
|
*
|
||||||
|
* Returns 0 on success with 2 references and locked
|
||||||
|
* -1 on failure with 1 reference and locked
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
virNWFilterBindingObjListAddObjLocked(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virNWFilterBindingObjPtr binding)
|
||||||
|
{
|
||||||
|
virNWFilterBindingDefPtr def = virNWFilterBindingObjGetDef(binding);
|
||||||
|
if (virHashAddEntry(bindings->objs, def->portdevname, binding) < 0)
|
||||||
|
return -1;
|
||||||
|
virObjectRef(binding);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* virNWFilterBindingObjListAddLocked:
|
||||||
|
*
|
||||||
|
* The returned @binding from this function will be locked and ref
|
||||||
|
* counted. The caller is expected to use virNWFilterBindingObjEndAPI
|
||||||
|
* when it completes usage.
|
||||||
|
*/
|
||||||
|
static virNWFilterBindingObjPtr
|
||||||
|
virNWFilterBindingObjListAddLocked(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virNWFilterBindingDefPtr def)
|
||||||
|
{
|
||||||
|
virNWFilterBindingObjPtr binding;
|
||||||
|
|
||||||
|
/* See if a binding with matching portdev already exists */
|
||||||
|
if ((binding = virNWFilterBindingObjListFindByPortDevLocked(
|
||||||
|
bindings, def->portdevname))) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||||
|
_("binding '%s' already exists"),
|
||||||
|
def->portdevname);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(binding = virNWFilterBindingObjNew()))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
virNWFilterBindingObjSetDef(binding, def);
|
||||||
|
|
||||||
|
if (virNWFilterBindingObjListAddObjLocked(bindings, binding) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
return binding;
|
||||||
|
|
||||||
|
error:
|
||||||
|
virNWFilterBindingObjEndAPI(&binding);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virNWFilterBindingObjPtr
|
||||||
|
virNWFilterBindingObjListAdd(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virNWFilterBindingDefPtr def)
|
||||||
|
{
|
||||||
|
virNWFilterBindingObjPtr ret;
|
||||||
|
|
||||||
|
virObjectRWLockWrite(bindings);
|
||||||
|
ret = virNWFilterBindingObjListAddLocked(bindings, def);
|
||||||
|
virObjectRWUnlock(bindings);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* The caller must hold lock on 'bindings' in addition to 'virNWFilterBindingObjListRemove'
|
||||||
|
* requirements
|
||||||
|
*
|
||||||
|
* Can be used to remove current element while iterating with
|
||||||
|
* virNWFilterBindingObjListForEach
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
virNWFilterBindingObjListRemoveLocked(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virNWFilterBindingObjPtr binding)
|
||||||
|
{
|
||||||
|
virNWFilterBindingDefPtr def = virNWFilterBindingObjGetDef(binding);
|
||||||
|
virHashRemoveEntry(bindings->objs, def->portdevname);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @bindings: Pointer to the binding object list
|
||||||
|
* @binding: NWFilterBinding pointer from either after Add or FindBy* API where the
|
||||||
|
* @binding was successfully added to the bindings->objs
|
||||||
|
* hash tables that now would need to be removed.
|
||||||
|
*
|
||||||
|
* The caller must hold a lock on the driver owning 'bindings',
|
||||||
|
* and must also have locked and ref counted 'binding', to ensure
|
||||||
|
* no one else is either waiting for 'binding' or still using it.
|
||||||
|
*
|
||||||
|
* When this function returns, @binding will be removed from the hash
|
||||||
|
* tables and returned with lock and refcnt that was present upon entry.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
virNWFilterBindingObjListRemove(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virNWFilterBindingObjPtr binding)
|
||||||
|
{
|
||||||
|
virNWFilterBindingObjSetRemoving(binding, true);
|
||||||
|
virObjectRef(binding);
|
||||||
|
virObjectUnlock(binding);
|
||||||
|
virObjectRWLockWrite(bindings);
|
||||||
|
virObjectLock(binding);
|
||||||
|
virNWFilterBindingObjListRemoveLocked(bindings, binding);
|
||||||
|
virObjectUnref(binding);
|
||||||
|
virObjectRWUnlock(bindings);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static virNWFilterBindingObjPtr
|
||||||
|
virNWFilterBindingObjListLoadStatus(virNWFilterBindingObjListPtr bindings,
|
||||||
|
const char *statusDir,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
char *statusFile = NULL;
|
||||||
|
virNWFilterBindingObjPtr obj = NULL;
|
||||||
|
virNWFilterBindingDefPtr def;
|
||||||
|
|
||||||
|
if ((statusFile = virNWFilterBindingObjConfigFile(statusDir, name)) == NULL)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (!(obj = virNWFilterBindingObjParseFile(statusFile)))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
def = virNWFilterBindingObjGetDef(obj);
|
||||||
|
if (virHashLookup(bindings->objs, def->portdevname) != NULL) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("unexpected binding %s already exists"),
|
||||||
|
def->portdevname);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virNWFilterBindingObjListAddObjLocked(bindings, obj) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
VIR_FREE(statusFile);
|
||||||
|
return obj;
|
||||||
|
|
||||||
|
error:
|
||||||
|
virNWFilterBindingObjEndAPI(&obj);
|
||||||
|
VIR_FREE(statusFile);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
virNWFilterBindingObjListLoadAllConfigs(virNWFilterBindingObjListPtr bindings,
|
||||||
|
const char *configDir)
|
||||||
|
{
|
||||||
|
DIR *dir;
|
||||||
|
struct dirent *entry;
|
||||||
|
int ret = -1;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
VIR_INFO("Scanning for configs in %s", configDir);
|
||||||
|
|
||||||
|
if ((rc = virDirOpenIfExists(&dir, configDir)) <= 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
virObjectRWLockWrite(bindings);
|
||||||
|
|
||||||
|
while ((ret = virDirRead(dir, &entry, configDir)) > 0) {
|
||||||
|
virNWFilterBindingObjPtr binding;
|
||||||
|
|
||||||
|
if (!virFileStripSuffix(entry->d_name, ".xml"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* NB: ignoring errors, so one malformed config doesn't
|
||||||
|
kill the whole process */
|
||||||
|
VIR_INFO("Loading config file '%s.xml'", entry->d_name);
|
||||||
|
binding = virNWFilterBindingObjListLoadStatus(bindings,
|
||||||
|
configDir,
|
||||||
|
entry->d_name);
|
||||||
|
if (binding)
|
||||||
|
virNWFilterBindingObjEndAPI(&binding);
|
||||||
|
else
|
||||||
|
VIR_ERROR(_("Failed to load config for binding '%s'"), entry->d_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_DIR_CLOSE(dir);
|
||||||
|
virObjectRWUnlock(bindings);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct virNWFilterBindingListIterData {
|
||||||
|
virNWFilterBindingObjListIterator callback;
|
||||||
|
void *opaque;
|
||||||
|
int ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virNWFilterBindingObjListHelper(void *payload,
|
||||||
|
const void *name ATTRIBUTE_UNUSED,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
struct virNWFilterBindingListIterData *data = opaque;
|
||||||
|
|
||||||
|
if (data->callback(payload, data->opaque) < 0)
|
||||||
|
data->ret = -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
virNWFilterBindingObjListForEach(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virNWFilterBindingObjListIterator callback,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
struct virNWFilterBindingListIterData data = {
|
||||||
|
callback, opaque, 0,
|
||||||
|
};
|
||||||
|
virObjectRWLockRead(bindings);
|
||||||
|
virHashForEach(bindings->objs, virNWFilterBindingObjListHelper, &data);
|
||||||
|
virObjectRWUnlock(bindings);
|
||||||
|
return data.ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct virNWFilterBindingListData {
|
||||||
|
virNWFilterBindingObjPtr *bindings;
|
||||||
|
size_t nbindings;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virNWFilterBindingObjListCollectIterator(void *payload,
|
||||||
|
const void *name ATTRIBUTE_UNUSED,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
struct virNWFilterBindingListData *data = opaque;
|
||||||
|
|
||||||
|
data->bindings[data->nbindings++] = virObjectRef(payload);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
virNWFilterBindingObjListFilter(virNWFilterBindingObjPtr **list,
|
||||||
|
size_t *nbindings,
|
||||||
|
virConnectPtr conn,
|
||||||
|
virNWFilterBindingObjListACLFilter filter)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
while (i < *nbindings) {
|
||||||
|
virNWFilterBindingObjPtr binding = (*list)[i];
|
||||||
|
virNWFilterBindingDefPtr def;
|
||||||
|
|
||||||
|
virObjectLock(binding);
|
||||||
|
|
||||||
|
def = virNWFilterBindingObjGetDef(binding);
|
||||||
|
/* do not list the object if:
|
||||||
|
* 1) it's being removed.
|
||||||
|
* 2) connection does not have ACL to see it
|
||||||
|
* 3) it doesn't match the filter
|
||||||
|
*/
|
||||||
|
if (virNWFilterBindingObjGetRemoving(binding) ||
|
||||||
|
(filter && !filter(conn, def))) {
|
||||||
|
virObjectUnlock(binding);
|
||||||
|
virObjectUnref(binding);
|
||||||
|
VIR_DELETE_ELEMENT(*list, i, *nbindings);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
virObjectUnlock(binding);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virNWFilterBindingObjListCollect(virNWFilterBindingObjListPtr domlist,
|
||||||
|
virConnectPtr conn,
|
||||||
|
virNWFilterBindingObjPtr **bindings,
|
||||||
|
size_t *nbindings,
|
||||||
|
virNWFilterBindingObjListACLFilter filter)
|
||||||
|
{
|
||||||
|
struct virNWFilterBindingListData data = { NULL, 0 };
|
||||||
|
|
||||||
|
virObjectRWLockRead(domlist);
|
||||||
|
sa_assert(domlist->objs);
|
||||||
|
if (VIR_ALLOC_N(data.bindings, virHashSize(domlist->objs)) < 0) {
|
||||||
|
virObjectRWUnlock(domlist);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
virHashForEach(domlist->objs, virNWFilterBindingObjListCollectIterator, &data);
|
||||||
|
virObjectRWUnlock(domlist);
|
||||||
|
|
||||||
|
virNWFilterBindingObjListFilter(&data.bindings, &data.nbindings, conn, filter);
|
||||||
|
|
||||||
|
*nbindings = data.nbindings;
|
||||||
|
*bindings = data.bindings;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
virNWFilterBindingObjListExport(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virConnectPtr conn,
|
||||||
|
virNWFilterBindingPtr **bindinglist,
|
||||||
|
virNWFilterBindingObjListACLFilter filter)
|
||||||
|
{
|
||||||
|
virNWFilterBindingObjPtr *bindingobjs = NULL;
|
||||||
|
size_t nbindings = 0;
|
||||||
|
size_t i;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (virNWFilterBindingObjListCollect(bindings, conn, &bindingobjs,
|
||||||
|
&nbindings, filter) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (bindinglist) {
|
||||||
|
if (VIR_ALLOC_N(*bindinglist, nbindings + 1) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
for (i = 0; i < nbindings; i++) {
|
||||||
|
virNWFilterBindingObjPtr binding = bindingobjs[i];
|
||||||
|
virNWFilterBindingDefPtr def = virNWFilterBindingObjGetDef(binding);
|
||||||
|
|
||||||
|
virObjectLock(binding);
|
||||||
|
(*bindinglist)[i] = virGetNWFilterBinding(conn, def->portdevname,
|
||||||
|
def->filter);
|
||||||
|
virObjectUnlock(binding);
|
||||||
|
|
||||||
|
if (!(*bindinglist)[i])
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = nbindings;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virObjectListFreeCount(bindingobjs, nbindings);
|
||||||
|
if (ret < 0) {
|
||||||
|
virObjectListFreeCount(*bindinglist, nbindings);
|
||||||
|
*bindinglist = NULL;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
69
src/conf/virnwfilterbindingobjlist.h
Normal file
69
src/conf/virnwfilterbindingobjlist.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* virnwfilterbindingobjlist.h: nwfilter binding object list utilities
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __VIR_NWFILTER_BINDING_OBJ_LIST_H__
|
||||||
|
# define __VIR_NWFILTER_BINDING_OBJ_LIST_H__
|
||||||
|
|
||||||
|
# include "virnwfilterbindingobj.h"
|
||||||
|
|
||||||
|
typedef struct _virNWFilterBindingObjList virNWFilterBindingObjList;
|
||||||
|
typedef virNWFilterBindingObjList *virNWFilterBindingObjListPtr;
|
||||||
|
|
||||||
|
virNWFilterBindingObjListPtr
|
||||||
|
virNWFilterBindingObjListNew(void);
|
||||||
|
|
||||||
|
virNWFilterBindingObjPtr
|
||||||
|
virNWFilterBindingObjListFindByPortDev(virNWFilterBindingObjListPtr bindings,
|
||||||
|
const char *name);
|
||||||
|
|
||||||
|
virNWFilterBindingObjPtr
|
||||||
|
virNWFilterBindingObjListAdd(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virNWFilterBindingDefPtr def);
|
||||||
|
|
||||||
|
void
|
||||||
|
virNWFilterBindingObjListRemove(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virNWFilterBindingObjPtr binding);
|
||||||
|
|
||||||
|
int
|
||||||
|
virNWFilterBindingObjListLoadAllConfigs(virNWFilterBindingObjListPtr bindings,
|
||||||
|
const char *configDir);
|
||||||
|
|
||||||
|
|
||||||
|
typedef int (*virNWFilterBindingObjListIterator)(virNWFilterBindingObjPtr binding,
|
||||||
|
void *opaque);
|
||||||
|
|
||||||
|
int
|
||||||
|
virNWFilterBindingObjListForEach(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virNWFilterBindingObjListIterator callback,
|
||||||
|
void *opaque);
|
||||||
|
|
||||||
|
typedef bool (*virNWFilterBindingObjListACLFilter)(virConnectPtr conn,
|
||||||
|
virNWFilterBindingDefPtr def);
|
||||||
|
|
||||||
|
int
|
||||||
|
virNWFilterBindingObjListExport(virNWFilterBindingObjListPtr bindings,
|
||||||
|
virConnectPtr conn,
|
||||||
|
virNWFilterBindingPtr **bindinglist,
|
||||||
|
virNWFilterBindingObjListACLFilter filter);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __VIR_NWFILTER_BINDING_OBJ_LIST_H__ */
|
@ -1071,6 +1071,16 @@ virNWFilterBindingObjSetDef;
|
|||||||
virNWFilterBindingObjSetRemoving;
|
virNWFilterBindingObjSetRemoving;
|
||||||
|
|
||||||
|
|
||||||
|
# conf/virnwfilterbindingobjlist.h
|
||||||
|
virNWFilterBindingObjListAdd;
|
||||||
|
virNWFilterBindingObjListExport;
|
||||||
|
virNWFilterBindingObjListFindByPortDev;
|
||||||
|
virNWFilterBindingObjListForEach;
|
||||||
|
virNWFilterBindingObjListLoadAllConfigs;
|
||||||
|
virNWFilterBindingObjListNew;
|
||||||
|
virNWFilterBindingObjListRemove;
|
||||||
|
|
||||||
|
|
||||||
# conf/virnwfilterobj.h
|
# conf/virnwfilterobj.h
|
||||||
virNWFilterObjGetDef;
|
virNWFilterObjGetDef;
|
||||||
virNWFilterObjGetNewDef;
|
virNWFilterObjGetNewDef;
|
||||||
|
Loading…
Reference in New Issue
Block a user