From: Marc-André Lureau <[email protected]>

Route the OpenGraphics, OpenGraphicsFD, and GraphicsReload driver
APIs through the standalone qemu-vnc D-Bus interface when active.
Client connections are passed via D-Bus fd-passing (AddClient),
certificate reloading uses the ReloadCertificates method, and
password changes use SetPassword.

Signed-off-by: Marc-André Lureau <[email protected]>
---
 src/qemu/qemu_driver.c  | 56 +++++++++++++++++++++++++++++++++++------
 src/qemu/qemu_hotplug.c | 12 +++++++++
 2 files changed, 61 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 83d0bab126..d79d68001f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -41,6 +41,7 @@
 #include "qemu_hotplug.h"
 #include "qemu_monitor.h"
 #include "qemu_passt.h"
+#include "qemu_vnc.h"
 #include "qemu_process.h"
 #include "qemu_migration.h"
 #include "qemu_migration_params.h"
@@ -14946,6 +14947,11 @@ qemuDomainOpenGraphics(virDomainPtr dom,
     }
     switch (vm->def->graphics[idx]->type) {
     case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+        if (QEMU_DOMAIN_GRAPHICS_PRIVATE(vm->def->graphics[idx])->vnc) {
+            ret = qemuVncAddClient(vm, fd,
+                                   (flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH) 
!= 0);
+            goto endjob;
+        }
         protocol = "vnc";
         break;
     case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
@@ -14985,6 +14991,25 @@ qemuDomainOpenGraphics(virDomainPtr dom,
     return ret;
 }
 
+
+static int
+qemuSocketPair(int pair[2],
+               virSecurityManager *mgr,
+               virDomainDef *vm)
+{
+    if (qemuSecuritySetSocketLabel(mgr, vm) < 0)
+        return -1;
+
+    if (socketpair(AF_UNIX, SOCK_STREAM, 0, pair) < 0)
+        return -1;
+
+    if (qemuSecurityClearSocketLabel(mgr, vm) < 0)
+        return -1;
+
+    return 0;
+}
+
+
 static int
 qemuDomainOpenGraphicsFD(virDomainPtr dom,
                          unsigned int idx,
@@ -15017,6 +15042,18 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom,
     }
     switch (vm->def->graphics[idx]->type) {
     case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+        if (QEMU_DOMAIN_GRAPHICS_PRIVATE(vm->def->graphics[idx])->vnc) {
+            if (qemuSocketPair(pair, driver->securityManager, vm->def) < 0)
+                goto cleanup;
+
+            if (qemuVncAddClient(vm, pair[1],
+                                 (flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH) 
!= 0) < 0)
+                goto cleanup;
+
+            ret = pair[0];
+            pair[0] = -1;
+            goto cleanup;
+        }
         protocol = "vnc";
         break;
     case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
@@ -15040,13 +15077,7 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom,
         goto cleanup;
     }
 
-    if (qemuSecuritySetSocketLabel(driver->securityManager, vm->def) < 0)
-        goto cleanup;
-
-    if (socketpair(PF_UNIX, SOCK_STREAM, 0, pair) < 0)
-        goto cleanup;
-
-    if (qemuSecurityClearSocketLabel(driver->securityManager, vm->def) < 0)
+    if (qemuSocketPair(pair, driver->securityManager, vm->def) < 0)
         goto cleanup;
 
     if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
@@ -20445,6 +20476,7 @@ qemuDomainGraphicsReload(virDomainPtr domain,
     int ret = -1;
     virDomainObj *vm = NULL;
     qemuDomainObjPrivate *priv;
+    size_t j;
 
     virCheckFlagsGoto(0, cleanup);
 
@@ -20486,6 +20518,16 @@ qemuDomainGraphicsReload(virDomainPtr domain,
 
     priv = vm->privateData;
 
+    for (j = 0; j < vm->def->ngraphics; j++) {
+        virDomainGraphicsDef *gfx = vm->def->graphics[j];
+
+        if (gfx->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+            QEMU_DOMAIN_GRAPHICS_PRIVATE(gfx)->vnc) {
+            ret = qemuVncReloadCertificates(vm);
+            goto endjob;
+        }
+    }
+
     qemuDomainObjEnterMonitor(vm);
 
     ret = qemuMonitorDisplayReload(priv->mon, "vnc", true);
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index b7a282b96e..404cec4a94 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -4543,6 +4543,18 @@ qemuDomainChangeGraphicsPasswords(virDomainObj *vm,
         return qemuRdpSetCredentials(vm, username, password, "");
     }
 
+    if (type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
+        size_t i;
+
+        for (i = 0; i < vm->def->ngraphics; i++) {
+            virDomainGraphicsDef *gfx = vm->def->graphics[i];
+
+            if (gfx->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+                QEMU_DOMAIN_GRAPHICS_PRIVATE(gfx)->vnc)
+                return qemuVncSetPassword(vm, password);
+        }
+    }
+
     if (auth->connected)
         connected = 
virDomainGraphicsAuthConnectedTypeToString(auth->connected);
 
-- 
2.53.0

Reply via email to