summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJán Tomko <jtomko@redhat.com>2014-10-01 15:36:04 +0200
committerFabiano Fidêncio <fidencio@redhat.com>2014-10-01 18:58:13 +0200
commitbb44ce0a1faaf7c7dbff2ca520b7ab83bda5b6ea (patch)
tree4ae2f103fa330c570878357d42a46f406c7d606a
parentec5a66146924c5b5dcfc6ea7e4eaa8857165981d (diff)
downloadvirt-viewer-bb44ce0a1faaf7c7dbff2ca520b7ab83bda5b6ea.tar.gz
virt-viewer-bb44ce0a1faaf7c7dbff2ca520b7ab83bda5b6ea.tar.xz
virt-viewer-bb44ce0a1faaf7c7dbff2ca520b7ab83bda5b6ea.zip
Prefer virDomainOpenGraphicsFD for --attach
The virDomainOpenGraphics API cannot label the socket we pass to it. Prefer virDomainOpenGraphicsFD (if building with libvirt 1.2.8 or later) which creates the socket for us and works with SELinux too. Fall back to the old API if the new one is unsupported (i.e. the libvirtd on the host is older than the libvirt version virt-viewer was compiled against). Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1141228 Signed-off-by: Ján Tomko <jtomko@redhat.com>
-rw-r--r--configure.ac8
-rw-r--r--src/virt-viewer.c15
2 files changed, 22 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index 5f7786d..91ce0e7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -117,6 +117,14 @@ AS_IF([test "x$have_libvirt" = "xyes"],
])
AM_CONDITIONAL([HAVE_LIBVIRT], [test "x$have_libvirt" = "xyes"])
+old_LIBS=$LIBS
+LIBS=$LIBVIRT_LIBS
+# virDomainOpenGraphicsFD was introduced in libvirt 1.2.8
+AC_CHECK_LIB([virt],
+ [virDomainOpenGraphicsFD],
+ [AC_DEFINE([HAVE_VIR_DOMAIN_OPEN_GRAPHICS_FD], 1, [Have virDomainOpenGraphicsFD?])])
+LIBS=$old_LIBS
+
AC_MSG_CHECKING([which gtk+ version to compile against])
AC_ARG_WITH([gtk],
[AS_HELP_STRING([--with-gtk=2.0|3.0],[which gtk+ version to compile against (default: 3.0)])],
diff --git a/src/virt-viewer.c b/src/virt-viewer.c
index c6066c5..4b90a59 100644
--- a/src/virt-viewer.c
+++ b/src/virt-viewer.c
@@ -428,18 +428,31 @@ virt_viewer_open_connection(VirtViewerApp *self G_GNUC_UNUSED, int *fd)
VirtViewer *viewer = VIRT_VIEWER(self);
VirtViewerPrivate *priv = viewer->priv;
int pair[2];
+ virErrorPtr err;
#endif
*fd = -1;
#if defined(HAVE_SOCKETPAIR)
if (!priv->dom)
return TRUE;
+#ifdef HAVE_VIR_DOMAIN_OPEN_GRAPHICS_FD
+ if ((*fd = virDomainOpenGraphicsFD(priv->dom, 0,
+ VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH)) >= 0)
+ return TRUE;
+
+ err = virGetLastError();
+ if (err && err->code != VIR_ERR_NO_SUPPORT) {
+ g_debug("Error %s", err->message ? err->message : "Unknown");
+ return TRUE;
+ }
+#endif
+
if (socketpair(PF_UNIX, SOCK_STREAM, 0, pair) < 0)
return FALSE;
if (virDomainOpenGraphics(priv->dom, 0, pair[0],
VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH) < 0) {
- virErrorPtr err = virGetLastError();
+ err = virGetLastError();
g_debug("Error %s", err && err->message ? err->message : "Unknown");
close(pair[0]);
close(pair[1]);