diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index dea180a712..ea9a9d46da 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -4381,3 +4381,34 @@ virNetworkObjListNumOfNetworks(virNetworkObjListPtr nets, return count; } + +/** + * virNetworkObjListPrune: + * @nets: a list of network objects + * @flags: bitwise-OR of virConnectListAllNetworksFlags + * + * Iterate over list of network objects and remove the desired + * ones from it. + */ +void +virNetworkObjListPrune(virNetworkObjListPtr nets, + unsigned int flags) +{ + size_t i = 0; + + while (i < nets->count) { + virNetworkObjPtr obj = nets->objs[i]; + + virNetworkObjLock(obj); + + if (virNetworkMatch(obj, flags)) { + virNetworkObjUnlock(obj); + virNetworkObjFree(obj); + + VIR_DELETE_ELEMENT(nets->objs, i, nets->count); + } else { + virNetworkObjUnlock(obj); + i++; + } + } +} diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index bd9e3b44d6..3fbd609397 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -464,6 +464,9 @@ int virNetworkObjListNumOfNetworks(virNetworkObjListPtr nets, virNetworkObjListFilter filter, virConnectPtr conn); +void virNetworkObjListPrune(virNetworkObjListPtr nets, + unsigned int flags); + /* for testing */ int virNetworkDefUpdateSection(virNetworkDefPtr def, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 626b515fa2..47c4d1d358 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -573,6 +573,7 @@ virNetworkObjListForEach; virNetworkObjListFree; virNetworkObjListGetNames; virNetworkObjListNumOfNetworks; +virNetworkObjListPrune; virNetworkObjLock; virNetworkObjReplacePersistentDef; virNetworkObjSetDefTransient;