[libvirt] [glib PATCH V6] Add bindings for virDomainSave*()

Zeeshan Ali (Khattak) zeeshanak at gnome.org
Sat Jul 14 01:10:30 UTC 2012


Looks pretty good. I already pushed it with a few small corrections as
pointed out below (Please do have a look at them for future
reference). Congratulations on your first patch to libvirt-glib. :)

On Fri, Jul 13, 2012 at 6:06 AM, Jovanka Gulicoska
<jovanka.gulicoska at gmail.com> wrote:
> ---
>  libvirt-gobject/libvirt-gobject-domain.c |  147 ++++++++++++++++++++++++++++++
>  libvirt-gobject/libvirt-gobject-domain.h |   18 ++++
>  libvirt-gobject/libvirt-gobject.sym      |    3 +
>  3 files changed, 168 insertions(+)
>
> diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c
> index 088cd33..308a817 100644
> --- a/libvirt-gobject/libvirt-gobject-domain.c
> +++ b/libvirt-gobject/libvirt-gobject-domain.c
> @@ -557,6 +557,153 @@ gboolean gvir_domain_reboot(GVirDomain *dom,
>  }
>
>  /**
> + * gvir_domain_save_to_file:
> + * @dom: the domain
> + * @filename: path to the output file
> + * @custom_conf: (allow-none): configuration for domain or NULL
> + * @flags: the flags
> + *
> + * Returns: TRUE on success, FALSE otherwise
> + */
> +gboolean gvir_domain_save_to_file(GVirDomain *dom,
> +                                  gchar *filename,
> +                                  GVirConfigDomain *custom_conf,
> +                                  guint flags,
> +                                  GError **err)
> +{
> +    GVirDomainPrivate *priv;
> +    int ret;
> +
> +    g_return_val_if_fail(GVIR_IS_DOMAIN(dom), FALSE);

'filename' also can't be NULL.

> +    g_return_val_if_fail(err == NULL || *err == NULL, FALSE);
> +
> +    priv = dom->priv;
> +
> +    if (flags || custom_conf != NULL) {
> +        gchar *custom_xml = NULL;
> +
> +        if (custom_conf != NULL)
> +            custom_xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(custom_conf));
> +
> +        ret = virDomainSaveFlags(priv->handle, filename, custom_xml, flags);
> +        g_free(custom_xml);
> +    }
> +    else {
> +        ret = virDomainSave(priv->handle, filename);
> +    }
> +
> +    if (ret < 0) {
> +        gvir_set_error_literal(err, GVIR_DOMAIN_ERROR,
> +                               0,
> +                               "Unable to save domain to file");
> +        return FALSE;
> +    }
> +
> +    return TRUE;
> +}
> +
> +typedef struct {
> +    gchar *filename;
> +    GVirConfigDomain *custom_conf;
> +    guint flags;
> +} DomainSaveToFileData;
> +
> +static void domain_save_to_file_data_free(DomainSaveToFileData *data)
> +{
> +    g_free(data->filename);
> +    g_object_unref(data->custom_conf);

NULL check needed before calling g_object_unref() on it. glib provides
g_clear_object() to make your life easier here.

> +    g_slice_free(DomainSaveToFileData, data);
> +}
> +
> +static void
> +gvir_domain_save_to_file_helper(GSimpleAsyncResult *res,
> +                                GObject *object,
> +                                GCancellable *cancellable G_GNUC_UNUSED)
> +{
> +    GVirDomain *dom = GVIR_DOMAIN(object);
> +    DomainSaveToFileData *data;
> +    GError *err = NULL;
> +
> +    data = g_simple_async_result_get_op_res_gpointer(res);
> +
> +    if (!gvir_domain_save_to_file(dom, data->filename, data->custom_conf, data->flags, &err))
> +        g_simple_async_result_take_error(res, err);
> +}
> +
> +/**
> + * gvir_domain_save_to_file_async:
> + * @dom: the domain
> + * @filename: path to output file
> + * @custom_conf: (allow-none): configuration for domain or NULL
> + * @flags: the flags
> + * @cancellable: (allow-none) (transfer none): cancallation object
> + * @callback: (scope async): completion callback
> + * @user_data: (closure): opaque data for callback
> + *
> + * Asynchronous variant of #gvir_domain_save_to_file
> + */
> +void gvir_domain_save_to_file_async(GVirDomain *dom,
> +                                    gchar *filename,
> +                                    GVirConfigDomain *custom_conf,
> +                                    guint flags,
> +                                    GCancellable *cancellable,
> +                                    GAsyncReadyCallback callback,
> +                                    gpointer user_data)
> +{
> +    GSimpleAsyncResult *res;
> +    DomainSaveToFileData *data;
> +
> +    g_return_if_fail(GVIR_IS_DOMAIN(dom));

Check for 'filename' needed here too.

> +    g_return_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable));
> +
> +    data = g_slice_new0(DomainSaveToFileData);
> +    data->filename = g_strdup(filename);
> +    data->custom_conf = g_object_ref(custom_conf);

NULL check needed before calling g_object_ref() on it.


-- 
Regards,

Zeeshan Ali (Khattak)
FSF member#5124




More information about the libvir-list mailing list