Add binding for virDomainOpenGraphicsFD. If virDomainOpenGraphicsFD is not available, it means we are dealing with older libvirt so we create the socket pair ourselves if that is the case. --- configure.ac | 4 ++ libvirt-gobject/libvirt-gobject-domain.c | 72 ++++++++++++++++++++++++++++++++ libvirt-gobject/libvirt-gobject-domain.h | 4 ++ libvirt-gobject/libvirt-gobject.sym | 5 +++ 4 files changed, 85 insertions(+) diff --git a/configure.ac b/configure.ac index 8cc3fca..bcb5cda 100644 --- a/configure.ac +++ b/configure.ac @@ -93,6 +93,10 @@ m4_if(m4_version_compare([2.61a.100], LIBVIRT_GLIB_COMPILE_WARNINGS PKG_CHECK_MODULES(LIBVIRT, libvirt >= $LIBVIRT_REQUIRED) +# virDomainOpenGraphicsFD was introduced in libvirt 1.2.8 +AC_CHECK_LIB([virt], + [virDomainOpenGraphicsFD], + [AC_DEFINE([HAVE_VIR_DOMAIN_OPEN_GRAPHICS_FD], 1, [Have virDomainOpenGraphicsFD?])]) enable_tests=no PKG_CHECK_MODULES(GLIB2, glib-2.0 >= $GLIB2_TEST_REQUIRED, [enable_tests=yes], diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 8df30d7..d41dadd 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -25,6 +25,7 @@ #include <libvirt/virterror.h> #include <string.h> +#include <sys/socket.h> #include "libvirt-glib/libvirt-glib.h" #include "libvirt-gobject/libvirt-gobject.h" @@ -1222,6 +1223,77 @@ cleanup: } /** + * gvir_domain_open_graphics_fd: + * @dom: the domain + * @idx: the graphics index + * @flags: extra flags, currently unused + * + * This will create a socket pair connected to the graphics backend of @dom. One + * end of the socket will be returned on success, and the other end is handed to + * the hypervisor. If @dom has multiple graphics backends configured, then @idx + * will determine which one is opened, starting from @idx 0. + * + * Returns: An fd on success, -1 on failure. + * + * Since: 0.2.0 + */ +int gvir_domain_open_graphics_fd(GVirDomain *dom, + guint idx, + unsigned int flags, + GError **err) +{ + GVirDomainPrivate *priv; + int ret = -1; +#ifndef HAVE_VIR_DOMAIN_OPEN_GRAPHICS_FD + int pair[2]; +#endif + + g_return_val_if_fail(GVIR_IS_DOMAIN(dom), -1); + g_return_val_if_fail(err == NULL || *err == NULL, -1); + + priv = dom->priv; + +#ifdef HAVE_VIR_DOMAIN_OPEN_GRAPHICS_FD + ret = virDomainOpenGraphicsFD(priv->handle, idx, flags); + if (ret <= 0) { + gvir_set_error_literal(err, GVIR_DOMAIN_ERROR, + 0, + "Unable to open graphics"); + goto end; + } +#else + + if (socketpair(PF_UNIX, SOCK_STREAM, 0, pair) < 0) { + gvir_set_error_literal(err, GVIR_DOMAIN_ERROR, + 0, + "Failed to create socket pair"); + goto end; + } + + if (virDomainOpenGraphics(priv->handle, idx, pair[0], flags) < 0) { + virErrorPtr vir_err; + + vir_err = virGetLastError(); + gvir_set_error_literal(err, GVIR_DOMAIN_ERROR, + 0, + vir_err && vir_err->message ? + vir_err->message : + "Unable to open graphics"); + close(pair[0]); + close(pair[1]); + + goto end; + } + close(pair[0]); + ret = pair[1]; + +#endif + +end: + return ret; +} + +/** * gvir_domain_suspend: * @dom: the domain to suspend * @err: Place-holder for possible errors diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 47ed784..4fe381e 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -332,6 +332,10 @@ gboolean gvir_domain_open_graphics(GVirDomain *dom, int fd, unsigned int flags, GError **err); +int gvir_domain_open_graphics_fd(GVirDomain *dom, + guint idx, + unsigned int flags, + GError **err); gboolean gvir_domain_suspend (GVirDomain *dom, GError **err); diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym index d18769b..927cad9 100644 --- a/libvirt-gobject/libvirt-gobject.sym +++ b/libvirt-gobject/libvirt-gobject.sym @@ -260,4 +260,9 @@ LIBVIRT_GOBJECT_0.1.9 { gvir_stream_io_condition_get_type; } LIBVIRT_GOBJECT_0.1.5; +LIBVIRT_GOBJECT_0.2.0 { + global: + gvir_domain_open_graphics_fd; +} LIBVIRT_GOBJECT_0.1.9; + # .... define new API here using predicted next version number .... -- 2.1.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list