Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/qemu/qemu_process.c | 123 ++++++++++++++++++++++++++++++------------------
1 file changed, 77 insertions(+), 46 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 3d78455..21c2db2 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4418,14 +4418,87 @@ qemuProcessGraphicsReservePorts(virQEMUDriverPtr driver,
static int
+qemuProcessGraphicsListenGenerate(virDomainObjPtr vm,
+ virQEMUDriverConfigPtr cfg,
+ virDomainGraphicsDefPtr graphics)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ const char *type = virDomainGraphicsTypeToString(graphics->type);
+ char *listenAddr = NULL;
+ bool autoSocket = false;
+ size_t i;
+
+ switch (graphics->type) {
+ case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+ if (cfg->vncAutoUnixSocket) {
+ autoSocket = true;
+ } else {
+ listenAddr = cfg->vncListen;
+ }
+ break;
+
+ case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
+ listenAddr = cfg->spiceListen;
+ break;
+
+ case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
+ case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
+ case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
+ case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
+ break;
+ }
+
+ for (i = 0; i < graphics->nListens; i++) {
+ virDomainGraphicsListenDefPtr glisten = &graphics->listens[i];
+
+ switch (glisten->type) {
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
+ /* If there is no address specified we will use address from
+ * qemu.conf from '*Listen'. If '*_auto_unix_socket' is set
it has
+ * higher priority and we will use unix socket as a default listen
+ * type. */
+ if (!glisten->address) {
+ if (autoSocket) {
+ memset(glisten, 0, sizeof(virDomainGraphicsListenDef));
+ if (virAsprintf(&glisten->socket, "%s/%s.sock",
+ priv->libDir, type) < 0)
+ return -1;
+ glisten->fromConfig = true;
+ glisten->type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET;
+ } else if (listenAddr) {
+ if (VIR_STRDUP(glisten->address, listenAddr) < 0)
+ return -1;
+ glisten->fromConfig = true;
+ }
+ }
+ break;
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
+ if (!glisten->socket) {
+ if (virAsprintf(&glisten->socket, "%s/%s.sock",
+ priv->libDir, type) < 0)
+ return -1;
+ glisten->autogenerated = true;
+ }
+ break;
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
+ break;
+ }
+ }
+
+ return 0;
+}
+
+
+static int
qemuProcessSetupGraphics(virQEMUDriverPtr driver,
virDomainObjPtr vm,
unsigned int flags)
{
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
- qemuDomainObjPrivatePtr priv = vm->privateData;
bool allocate = !(flags & VIR_QEMU_PROCESS_START_PRETEND);
- size_t i, j;
+ size_t i;
int ret = -1;
if (allocate && qemuProcessGraphicsReservePorts(driver, vm) < 0)
@@ -4433,22 +4506,16 @@ qemuProcessSetupGraphics(virQEMUDriverPtr driver,
for (i = 0; i < vm->def->ngraphics; ++i) {
virDomainGraphicsDefPtr graphics = vm->def->graphics[i];
- const char *type = virDomainGraphicsTypeToString(graphics->type);
- char *listenAddr = NULL;
switch (graphics->type) {
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
if (qemuProcessVNCAllocatePorts(driver, graphics, allocate) < 0)
goto cleanup;
-
- listenAddr = cfg->vncListen;
break;
case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
if (qemuProcessSPICEAllocatePorts(driver, cfg, graphics, allocate) < 0)
goto cleanup;
-
- listenAddr = cfg->spiceListen;
break;
case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
@@ -4458,44 +4525,8 @@ qemuProcessSetupGraphics(virQEMUDriverPtr driver,
break;
}
- for (j = 0; j < graphics->nListens; j++) {
- virDomainGraphicsListenDefPtr glisten = &graphics->listens[j];
-
- switch (glisten->type) {
- case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
- if (!glisten->address) {
- /* If there is no address specified and qemu.conf has
- * vnc_auto_unix_socket set we should use unix socket as
- * default instead of tcp listen. */
- if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
- cfg->vncAutoUnixSocket) {
- memset(glisten, 0, sizeof(virDomainGraphicsListenDef));
- if (virAsprintf(&glisten->socket, "%s/%s.sock",
- priv->libDir, type) < 0)
- goto cleanup;
- glisten->fromConfig = true;
- glisten->type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET;
- } else if (listenAddr) {
- if (VIR_STRDUP(glisten->address, listenAddr) < 0)
- goto cleanup;
- glisten->fromConfig = true;
- }
- }
- break;
- case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
- if (!glisten->socket) {
- if (virAsprintf(&glisten->socket, "%s/%s.sock",
- priv->libDir, type) < 0)
- goto cleanup;
- glisten->autogenerated = true;
- }
- break;
- case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
- case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
- case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
- break;
- }
- }
+ if (qemuProcessGraphicsListenGenerate(vm, cfg, graphics) < 0)
+ goto cleanup;
}
ret = 0;
--
2.8.2