[libvirt] [PATCH 1/8] hellolibvirt: Update hellolibvirt example

Michal Privoznik mprivozn at redhat.com
Tue Feb 19 10:26:34 UTC 2013


On 19.02.2013 03:14, John Ferlan wrote:
> Add a list of active domains, list of active/inactive networks, and
> list of active/inactive storage pools
> ---
>  examples/hellolibvirt/hellolibvirt.c | 201 ++++++++++++++++++++++++++++++-----
>  1 file changed, 173 insertions(+), 28 deletions(-)
> 
> diff --git a/examples/hellolibvirt/hellolibvirt.c b/examples/hellolibvirt/hellolibvirt.c
> index 234637e..f191782 100644
> --- a/examples/hellolibvirt/hellolibvirt.c
> +++ b/examples/hellolibvirt/hellolibvirt.c
> @@ -85,65 +85,200 @@ out:
>      return ret;
>  }
>  
> -
> +typedef int (*virFunction)(virConnectPtr conn,
> +                           char **nameList,
> +                           int maxnames);
>  static int
> -showDomains(virConnectPtr conn)
> +listObject(virConnectPtr conn, int maxnames, const char *objNameStr,
> +           virFunction fcn)
>  {
> -    int ret = 0, i, numNames, numInactiveDomains, numActiveDomains;
> +    int ret = 0, i, numNames;
>      char **nameList = NULL;
>  
> -    numActiveDomains = virConnectNumOfDomains(conn);
> -    if (-1 == numActiveDomains) {
> +    nameList = malloc(sizeof(*nameList) * maxnames);
> +
> +    if (NULL == nameList) {

If blue is the sky .... These Yoda conditions should really be made
inverted. But there are some even outside of the hellolibvirt.c.

>          ret = 1;
> -        printf("Failed to get number of active domains\n");
> +        printf("Could not allocate memory for list of %s\n", objNameStr);
> +        goto out;
> +    }
> +
> +    numNames = (*fcn)(conn, nameList, maxnames);
> +
> +    if (-1 == numNames) {
> +        ret = 1;
> +        printf("Could not get list of %s from hypervisor\n", objNameStr);
>          showError(conn);
>          goto out;
>      }
>  
> -    numInactiveDomains = virConnectNumOfDefinedDomains(conn);
> -    if (-1 == numInactiveDomains) {
> +    printf("    %s: \n", objNameStr);
> +    for (i = 0; i < numNames; i++) {
> +        printf("\t%s\n", *(nameList + i));
> +        /* The API documentation doesn't say so, but the names
> +         * returned by are strdup'd and must be freed here.
> +         */

The docs should be fixed then.

> +        free(*(nameList + i));
> +    }
> +
> +out:
> +    free(nameList);
> +    return ret;
> +}

I wonder if we should advise users to use the other list APIs that are
around for a while (virConnectListAll. I guess it all boils down to
question if the hellolibvirt binary is supposed to work with ancient
libvirts or is just an example shipped within a release.
In case it is supposed to work with prehistoric versions, we must add a
fallback code. If we are satisfied with the example working with current
libvirt, there's no need for fallbacking code then.

Michal




More information about the libvir-list mailing list