[libvirt] [libvirt-glib 6/6] Add gvir_domain_get_devices()

Christophe Fergeau cfergeau at redhat.com
Thu Mar 1 10:24:12 UTC 2012


ACK, a few nits below

On Thu, Mar 01, 2012 at 12:15:42AM +0200, Zeeshan Ali (Khattak) wrote:
> From: "Zeeshan Ali (Khattak)" <zeeshanak at gnome.org>
> 
> Currently we only support existing DomainDevice implementations:
> DomainDisk and DomainInterface.
> ---
>  .../libvirt-gobject-domain-device-private.h        |    2 +
>  libvirt-gobject/libvirt-gobject-domain-device.c    |   22 ++++++++++
>  libvirt-gobject/libvirt-gobject-domain.c           |   42 ++++++++++++++++++++
>  libvirt-gobject/libvirt-gobject-domain.h           |    3 +
>  libvirt-gobject/libvirt-gobject.sym                |    1 +
>  5 files changed, 70 insertions(+), 0 deletions(-)
> 
> diff --git a/libvirt-gobject/libvirt-gobject-domain-device-private.h b/libvirt-gobject/libvirt-gobject-domain-device-private.h
> index 72c660e..a505ecd 100644
> --- a/libvirt-gobject/libvirt-gobject-domain-device-private.h
> +++ b/libvirt-gobject/libvirt-gobject-domain-device-private.h
> @@ -24,6 +24,8 @@
>  
>  G_BEGIN_DECLS
>  
> +G_GNUC_INTERNAL GVirDomainDevice *gvir_domain_device_new(GVirDomain *domain,
> +                                                         GVirConfigDomainDevice *config);
>  virDomainPtr gvir_domain_device_get_domain_handle(GVirDomainDevice *self);
>  
>  G_END_DECLS
> diff --git a/libvirt-gobject/libvirt-gobject-domain-device.c b/libvirt-gobject/libvirt-gobject-domain-device.c
> index 35d4855..f2195af 100644
> --- a/libvirt-gobject/libvirt-gobject-domain-device.c
> +++ b/libvirt-gobject/libvirt-gobject-domain-device.c
> @@ -178,3 +178,25 @@ GVirConfigDomainDevice *gvir_domain_device_get_config(GVirDomainDevice *device)
>  {
>      return g_object_ref (device->priv->config);
>  }
> +
> +G_GNUC_INTERNAL GVirDomainDevice *gvir_domain_device_new(GVirDomain *domain,
> +                                                         GVirConfigDomainDevice *config)
> +{
> +    GType type;
> +
> +    g_return_val_if_fail(GVIR_IS_DOMAIN(domain), NULL);
> +    g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_DEVICE(config), NULL);
> +
> +    if (GVIR_CONFIG_IS_DOMAIN_DISK(config))
> +        type = GVIR_TYPE_DOMAIN_DISK;
> +    else if (GVIR_CONFIG_IS_DOMAIN_INTERFACE(config))
> +        type = GVIR_TYPE_DOMAIN_INTERFACE;
> +    else {
> +        g_debug("Unknown device type: %s", G_OBJECT_TYPE_NAME(config));
> +        return NULL;
> +    }

Coding style nit:
(from HACKING)
 - If a brace needs to be used for one clause in an if/else statement,
   it should be used for both clauses, even if the other clauses are
   only single statements. eg

      if (foo) {
         bar;
         wizz;
      } else {
         eek;
      }

   Not

      if (foo) {
         bar;
         wizz;
      } else
         eek;

> +
> +    return GVIR_DOMAIN_DEVICE(g_object_new(type,
> +                                           "config", config,
> +                                           "domain", domain, NULL));
> +}
> diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c
> index 23ad882..ae86f0e 100644
> --- a/libvirt-gobject/libvirt-gobject-domain.c
> +++ b/libvirt-gobject/libvirt-gobject-domain.c
> @@ -29,6 +29,7 @@
>  #include "libvirt-glib/libvirt-glib.h"
>  #include "libvirt-gobject/libvirt-gobject.h"
>  #include "libvirt-gobject-compat.h"
> +#include "libvirt-gobject/libvirt-gobject-domain-device-private.h"
>  
>  #define GVIR_DOMAIN_GET_PRIVATE(obj)                         \
>          (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_DOMAIN, GVirDomainPrivate))
> @@ -868,3 +869,44 @@ gboolean gvir_domain_get_saved(GVirDomain *dom)
>  
>      return virDomainHasManagedSaveImage(dom->priv->handle, 0) == 1;
>  }
> +
> +/**
> + * gvir_domain_get_devices:
> + * @domain: the domain
> + * @err: place-holder for possible errors, or NULL
> + *
> + * Gets the list of devices attached to @domain
> + *
> + * Returns: (element-type LibvirtGObject.DomainDevice) (transfer full): a newly
> + * allocated #GList of #GVirDomainDevice.
> + */
> +GList *gvir_domain_get_devices(GVirDomain *domain,
> +                               GError **err)
> +{
> +    GVirConfigDomain *config;
> +    GList *config_devices;
> +    GList *node;
> +    GList *ret = NULL;
> +
> +    g_return_val_if_fail(GVIR_IS_DOMAIN(domain), NULL);

In other patches, you're testing 'err' for sanity too

> +
> +    config = gvir_domain_get_config(domain, 0, err);
> +    if (config == NULL)
> +        return ret;

return NULL would be more readable.

> +
> +    config_devices = gvir_config_domain_get_devices(config);
> +    for (node = config_devices; node != NULL; node = node->next) {
> +        GVirConfigDomainDevice *device_config;
> +        GVirDomainDevice *device;
> +
> +        device_config = GVIR_CONFIG_DOMAIN_DEVICE(node->data);
> +        device = gvir_domain_device_new(domain, device_config);
> +        if (device != NULL)
> +             ret = g_list_prepend(ret, device);
> +
> +        g_object_unref (device_config);
> +    }
> +    g_list_free (config_devices);
> +
> +    return ret;
> +}
> diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h
> index 56500a8..8a4836e 100644
> --- a/libvirt-gobject/libvirt-gobject-domain.h
> +++ b/libvirt-gobject/libvirt-gobject-domain.h
> @@ -183,6 +183,9 @@ gboolean gvir_domain_save_finish (GVirDomain *dom,
>  gboolean gvir_domain_get_persistent(GVirDomain *dom);
>  gboolean gvir_domain_get_saved(GVirDomain *dom);
>  
> +GList *gvir_domain_get_devices(GVirDomain *domain,
> +                               GError **err);
> +
>  G_END_DECLS
>  
>  #endif /* __LIBVIRT_GOBJECT_DOMAIN_H__ */
> diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym
> index d6999dc..460280b 100644
> --- a/libvirt-gobject/libvirt-gobject.sym
> +++ b/libvirt-gobject/libvirt-gobject.sym
> @@ -68,6 +68,7 @@ LIBVIRT_GOBJECT_0.0.4 {
>  	gvir_domain_reboot;
>  	gvir_domain_get_config;
>  	gvir_domain_set_config;
> +	gvir_domain_get_devices;
>  	gvir_domain_get_info;
>  	gvir_domain_get_persistent;
>  	gvir_domain_get_saved;
> -- 
> 1.7.7.6
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120301/c9e1bdd9/attachment-0001.sig>


More information about the libvir-list mailing list