[libvirt] [PATCH v3 10/14] qemu_process: separate graphics socket and address generation

Pavel Hrdina phrdina at redhat.com
Thu May 12 15:15:54 UTC 2016


Signed-off-by: Pavel Hrdina <phrdina at 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




More information about the libvir-list mailing list