which is basically a wrapper for virConnectGetVersion(). --- examples/conn-test.c | 13 ++++++++ libvirt-gobject/libvirt-gobject-connection.c | 40 ++++++++++++++++++++++++++ libvirt-gobject/libvirt-gobject-connection.h | 3 +- libvirt-gobject/libvirt-gobject.sym | 1 + 4 files changed, 56 insertions(+), 1 deletions(-) diff --git a/examples/conn-test.c b/examples/conn-test.c index b90d2b0..051f96a 100644 --- a/examples/conn-test.c +++ b/examples/conn-test.c @@ -32,6 +32,8 @@ do_connection_open(GObject *source, GVirConnection *conn = GVIR_CONNECTION(source); GError *err = NULL; gchar *hv_name = NULL; + gulong hv_version = 0; + guint major, minor, micro; if (!gvir_connection_open_finish(conn, res, &err)) { g_error("%s", err->message); @@ -46,6 +48,17 @@ do_connection_open(GObject *source, g_print("Hypervisor name: %s\n", hv_name); + if (!(hv_version = gvir_connection_get_version(conn, &err))) { + g_error("%s", err->message); + goto cleanup; + } + + major = hv_version / 1000000; + hv_version %= 1000000; + minor = hv_version / 1000; + micro = hv_version % 1000; + g_print("Hypervisor version: %u.%u.%u\n", major, minor, micro); + cleanup: g_free(hv_name); g_object_unref(conn); diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index 75bf041..e1b765d 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -1070,6 +1070,46 @@ cleanup: return ret; } +/** + * gvir_connection_get_version: + * @conn: a #GVirConnection + * @err: return location for any #GError + * + * Get version of current hypervisor used. + * + * Return value: version on success, 0 otherwise and @err set. + */ +gulong +gvir_connection_get_version(GVirConnection *conn, + GError **err) +{ + GVirConnectionPrivate *priv; + gulong ret = 0; + + g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE); + g_return_val_if_fail(err == NULL || *err == NULL, 0); + + priv = conn->priv; + /* Stop another thread closing the connection just at the minute */ + virConnectRef(priv->conn); + if (!priv->conn) { + g_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, + "Connection is not open"); + goto cleanup; + } + + if (virConnectGetVersion(priv->conn, &ret) < 0) { + gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, + "Unable to get hypervisor version"); + goto cleanup; + } + +cleanup: + if (priv->conn) + virConnectClose(priv->conn); + return ret; +} + static void gvir_domain_ref(gpointer obj, gpointer ignore G_GNUC_UNUSED) { g_object_ref(obj); diff --git a/libvirt-gobject/libvirt-gobject-connection.h b/libvirt-gobject/libvirt-gobject-connection.h index 62eb024..f91ca05 100644 --- a/libvirt-gobject/libvirt-gobject-connection.h +++ b/libvirt-gobject/libvirt-gobject-connection.h @@ -114,7 +114,8 @@ const gchar *gvir_connection_get_uri(GVirConnection *conn); gchar *gvir_connection_get_hypervisor_name(GVirConnection *conn, GError **err); - +gulong gvir_connection_get_version(GVirConnection *conn, + GError **err); GList *gvir_connection_get_domains(GVirConnection *conn); GVirDomain *gvir_connection_get_domain(GVirConnection *conn, diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index 2c2f1f4..c496540 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -197,6 +197,7 @@ LIBVIRT_GOBJECT_0.1.2 { LIBVIRT_GOBJECT_0.1.3 { global: gvir_connection_get_hypervisor_name; + gvir_connection_get_version; } LIBVIRT_GOBJECT_0.1.2; # .... define new API here using predicted next version number .... -- 1.7.8.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list