[libvirt] [PATCH 5/6] conf: Add helper to convert list of virDomains to a list of virDomainObjs

John Ferlan jferlan at redhat.com
Mon May 11 10:33:00 UTC 2015



On 04/30/2015 08:44 AM, Peter Krempa wrote:
> Add virDomainObjListConvert that will take a list of virDomains, apply
> filters and return a list of virDomainObjs.
> ---
>  src/conf/domain_conf.c   | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/domain_conf.h   |  9 ++++++++
>  src/libvirt_private.syms |  1 +
>  3 files changed, 64 insertions(+)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 66fe470..73dc33f 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -23072,6 +23072,60 @@ virDomainObjListCollect(virDomainObjListPtr domlist,
> 
> 
>  int
> +virDomainObjListConvert(virDomainObjListPtr domlist,
> +                        virConnectPtr conn,
> +                        virDomainPtr *doms,
> +                        size_t ndoms,
> +                        virDomainObjPtr **vms,
> +                        size_t *nvms,
> +                        virDomainObjListACLFilter filter,
> +                        unsigned int flags,
> +                        bool skip_missing)
> +{
> +    char uuidstr[VIR_UUID_STRING_BUFLEN];
> +    virDomainObjPtr vm;
> +    size_t i;
> +
> +    *nvms = 0;
> +    *vms = NULL;
> +
> +    virObjectLock(domlist);
> +    for (i = 0; i < ndoms; i++) {
> +        virDomainPtr dom = doms[i];
> +
> +        virUUIDFormat(dom->uuid, uuidstr);
> +
> +        if (!(vm = virHashLookup(domlist->objs, uuidstr))) {
> +            if (!skip_missing) {
> +                virReportError(VIR_ERR_NO_DOMAIN,
> +                               _("no domain with matching uuid '%s' (%s)"),
> +                               uuidstr, dom->name);
> +                virObjectUnlock(domlist);
> +                goto error;
> +            }
> +        } else {
> +            virObjectRef(vm);
> +
> +            if (VIR_APPEND_ELEMENT(*vms, *nvms, vm) < 0)
> +                goto error;
> +        }
> +    }
> +    virObjectUnlock(domlist);
> +
> +    virDomainObjListFilter(vms, nvms, conn, filter, flags);

Coverity complains here too - if 'vms' is NULL, then ObjListFilter
derefs.  Coverity shows an example of ndoms == 2 and for each iteration
through the loop it takes the skip_missing path.

John
> +
> +    return 0;
> +
> + error:
> +    virObjectListFreeCount(*vms, *nvms);
> +    *vms = NULL;
> +    *nvms = 0;
> +
> +    return -1;
> +}
> +
> +
> +int
>  virDomainObjListExport(virDomainObjListPtr domlist,
>                         virConnectPtr conn,
>                         virDomainPtr **domains,
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index ac11a20..06ca82f 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -3059,6 +3059,15 @@ int virDomainObjListExport(virDomainObjListPtr doms,
>                             virDomainPtr **domains,
>                             virDomainObjListACLFilter filter,
>                             unsigned int flags);
> +int virDomainObjListConvert(virDomainObjListPtr domlist,
> +                            virConnectPtr conn,
> +                            virDomainPtr *doms,
> +                            size_t ndoms,
> +                            virDomainObjPtr **vms,
> +                            size_t *nvms,
> +                            virDomainObjListACLFilter filter,
> +                            unsigned int flags,
> +                            bool skip_missing);
> 
>  int
>  virDomainDefMaybeAddController(virDomainDefPtr def,
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 9a7a944..67a7e21 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -386,6 +386,7 @@ virDomainObjGetPersistentDef;
>  virDomainObjGetState;
>  virDomainObjListAdd;
>  virDomainObjListCollect;
> +virDomainObjListConvert;
>  virDomainObjListExport;
>  virDomainObjListFindByID;
>  virDomainObjListFindByName;
> 




More information about the libvir-list mailing list