[libvirt] [PATCH 3/7] list: Add helpers to list network objects
Laine Stump
laine at laine.org
Mon Sep 10 15:40:57 UTC 2012
On 09/04/2012 11:55 AM, Osier Yang wrote:
> src/conf/network_conf.c: Add virNetworkMatch to filter the networks;
> and virNetworkList to iterate over all the networks with the filter.
>
> src/conf/network_conf.h: Declare virNetworkList and define the macros
> for filters.
>
> src/libvirt_private.syms: Export virNetworkList.
> ---
> src/conf/network_conf.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++
> src/conf/network_conf.h | 22 +++++++++++
> src/libvirt_private.syms | 1 +
> 3 files changed, 114 insertions(+), 0 deletions(-)
>
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index 9d53d8e..1ee0951 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -2056,3 +2056,94 @@ void virNetworkObjUnlock(virNetworkObjPtr obj)
> {
> virMutexUnlock(&obj->lock);
> }
> +
> +#define MATCH(FLAG) (flags & (FLAG))
> +static bool
> +virNetworkMatch (virNetworkObjPtr netobj,
> + unsigned int flags)
> +{
> + /* filter by active state */
> + if (MATCH(VIR_CONNECT_LIST_NETWORKS_FILTERS_ACTIVE) &&
> + !((MATCH(VIR_CONNECT_LIST_NETWORKS_ACTIVE) &&
> + virNetworkObjIsActive(netobj)) ||
> + (MATCH(VIR_CONNECT_LIST_NETWORKS_INACTIVE) &&
> + !virNetworkObjIsActive(netobj))))
> + return false;
> +
> + /* filter by persistence */
> + if (MATCH(VIR_CONNECT_LIST_NETWORKS_FILTERS_PERSISTENT) &&
> + !((MATCH(VIR_CONNECT_LIST_NETWORKS_PERSISTENT) &&
> + netobj->persistent) ||
> + (MATCH(VIR_CONNECT_LIST_NETWORKS_TRANSIENT) &&
> + !netobj->persistent)))
> + return false;
> +
> + /* filter by autostart option */
> + if (MATCH(VIR_CONNECT_LIST_NETWORKS_FILTERS_AUTOSTART) &&
> + !((MATCH(VIR_CONNECT_LIST_NETWORKS_AUTOSTART) &&
> + netobj->autostart) ||
> + (MATCH(VIR_CONNECT_LIST_NETWORKS_NO_AUTOSTART) &&
> + !netobj->autostart)))
> + return false;
> +
> + return true;
> +}
> +#undef MATCH
> +
> +int
> +virNetworkList(virConnectPtr conn,
> + virNetworkObjList netobjs,
> + virNetworkPtr **nets,
> + unsigned int flags)
> +{
> + virNetworkPtr *tmp_nets = NULL;
> + virNetworkPtr net = NULL;
> + int nnets = 0;
> + int ret = -1;
> + int i;
> +
> + if (nets) {
> + if (VIR_ALLOC_N(tmp_nets, netobjs.count + 1) < 0) {
> + virReportOOMError();
> + goto cleanup;
> + }
> + }
> +
> + for (i = 0; i < netobjs.count; i++) {
> + virNetworkObjPtr netobj = netobjs.objs[i];
> + virNetworkObjLock(netobj);
> + if (virNetworkMatch(netobj, flags)) {
> + if (nets) {
> + if (!(net = virGetNetwork(conn,
> + netobj->def->name,
> + netobj->def->uuid))) {
> + virNetworkObjUnlock(netobj);
> + goto cleanup;
> + }
> + tmp_nets[nnets] = net;
> + }
> + nnets++;
> + }
> + virNetworkObjUnlock(netobj);
> + }
> +
> + if (tmp_nets) {
> + /* trim the array to the final size */
> + ignore_value(VIR_REALLOC_N(tmp_nets, nnets + 1));
> + *nets = tmp_nets;
> + tmp_nets = NULL;
> + }
> +
> + ret = nnets;
> +
> +cleanup:
> + if (tmp_nets) {
> + for (i = 0; i < nnets; i++) {
> + if (tmp_nets[i])
> + virNetworkFree(tmp_nets[i]);
> + }
> + }
> +
> + VIR_FREE(tmp_nets);
> + return ret;
> +}
> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
> index f49c367..5dbf50d 100644
> --- a/src/conf/network_conf.h
> +++ b/src/conf/network_conf.h
> @@ -321,4 +321,26 @@ void virNetworkObjUnlock(virNetworkObjPtr obj);
>
> VIR_ENUM_DECL(virNetworkForward)
>
> +# define VIR_CONNECT_LIST_NETWORKS_FILTERS_ACTIVE \
> + (VIR_CONNECT_LIST_NETWORKS_ACTIVE | \
> + VIR_CONNECT_LIST_NETWORKS_INACTIVE)
> +
> +# define VIR_CONNECT_LIST_NETWORKS_FILTERS_PERSISTENT \
> + (VIR_CONNECT_LIST_NETWORKS_PERSISTENT | \
> + VIR_CONNECT_LIST_NETWORKS_TRANSIENT)
> +
> +# define VIR_CONNECT_LIST_NETWORKS_FILTERS_AUTOSTART \
> + (VIR_CONNECT_LIST_NETWORKS_AUTOSTART | \
> + VIR_CONNECT_LIST_NETWORKS_NO_AUTOSTART)
> +
> +# define VIR_CONNECT_LIST_NETWORKS_FILTERS_ALL \
> + (VIR_CONNECT_LIST_NETWORKS_FILTERS_ACTIVE | \
> + VIR_CONNECT_LIST_NETWORKS_FILTERS_PERSISTENT | \
> + VIR_CONNECT_LIST_NETWORKS_FILTERS_AUTOSTART)
> +
> +int virNetworkList(virConnectPtr conn,
> + virNetworkObjList netobjs,
> + virNetworkPtr **nets,
> + unsigned int flags);
> +
> #endif /* __NETWORK_CONF_H__ */
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index abfee47..7464c59 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -837,6 +837,7 @@ virNetworkFindByName;
> virNetworkFindByUUID;
> virNetworkIpDefNetmask;
> virNetworkIpDefPrefix;
> +virNetworkList;
> virNetworkLoadAllConfigs;
> virNetworkObjIsDuplicate;
> virNetworkObjListFree;
ACK.
More information about the libvir-list
mailing list