From: Marc-André Lureau <marcandre.lureau@redhat.com> 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 <marcandre.lureau@redhat.com> --- 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