From: Marc-André Lureau Date: Wed, 22 Apr 2026 14:14:36 +0000 (+0400) Subject: qemu: wire up standalone VNC in driver APIs X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=fa0a4c899f032f3d013f1eec08bbbc654b06a6c2;p=thirdparty%2Flibvirt.git qemu: wire up standalone VNC in driver APIs 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 Reviewed-by: Michal Privoznik --- diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2071f13b45..c112205483 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" @@ -15095,6 +15096,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: @@ -15134,6 +15140,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, @@ -15166,6 +15191,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: @@ -15189,13 +15226,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) @@ -20578,6 +20609,7 @@ qemuDomainGraphicsReload(virDomainPtr domain, int ret = -1; virDomainObj *vm = NULL; qemuDomainObjPrivate *priv; + size_t j; virCheckFlagsGoto(0, cleanup); @@ -20619,6 +20651,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 8d45a6db9d..5be567b510 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -4542,6 +4542,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);