break;
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+ if (QEMU_DOMAIN_GRAPHICS_PRIVATE(graphics)->vnc)
+ break;
if (qemuBuildGraphicsVNCCommandLine(cfg, def, cmd,
graphics) < 0)
return -1;
g_free(priv->tlsAlias);
g_clear_pointer(&priv->secinfo, qemuDomainSecretInfoFree);
g_clear_pointer(&priv->rdp, qemuRdpFree);
+ g_clear_pointer(&priv->vnc, qemuVncFree);
}
return -1;
continue;
}
+ case VIR_DOMAIN_GRAPHICS_TYPE_VNC: {
+ if (QEMU_DOMAIN_GRAPHICS_PRIVATE(graphics)->vnc) {
+ if (qemuVncStart(vm, graphics) < 0)
+ return -1;
+ }
+ continue;
+ }
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
- case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
qemuRdpStop(vm, graphics);
continue;
}
+ case VIR_DOMAIN_GRAPHICS_TYPE_VNC: {
+ qemuVncStop(vm, graphics);
+ continue;
+ }
case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
- case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
}
+static bool
+qemuHasNonP2PDbusGraphics(virDomainDef *def)
+{
+ size_t i;
+
+ for (i = 0; i < def->ngraphics; i++) {
+ virDomainGraphicsDef *g = def->graphics[i];
+
+ if (g->type == VIR_DOMAIN_GRAPHICS_TYPE_DBUS && !g->data.dbus.p2p)
+ return true;
+ }
+
+ return false;
+}
+
+
+static int
+qemuPrepareGraphicsVnc(virQEMUDriver *driver,
+ virDomainDef *def,
+ virDomainGraphicsDef *gfx)
+{
+ g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+
+ if (!qemuHasNonP2PDbusGraphics(def))
+ return 0;
+
+ if (!qemuVncAvailable(cfg->qemuVncName))
+ return 0;
+
+ QEMU_DOMAIN_GRAPHICS_PRIVATE(gfx)->vnc = qemuVncNew();
+
+ return 0;
+}
+
+
static int
qemuProcessSetupGraphics(virQEMUDriver *driver,
virDomainObj *vm,
if (qemuProcessGraphicsSetupDBus(driver, graphics, vm) < 0)
return -1;
+
+ if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+ qemuPrepareGraphicsVnc(driver, vm->def, graphics) < 0)
+ return -1;
}
if (allocate) {
if (gfx->type == VIR_DOMAIN_GRAPHICS_TYPE_RDP &&
qemuPrepareGraphicsRdp(priv->driver, gfx) < 0)
return -1;
-
}
return 0;