[libvirt] [PATCH RESENT 09/12] libxl: fill HVM SDL and VNC settings based on <graphics/> entries

Marek Marczykowski marmarek at invisiblethingslab.com
Wed Apr 10 02:44:43 UTC 2013


Vfb entries in domain config are used only by PV drivers. Qemu
parameters are build based on b_info struct. So fill it with the same
data as vfb entries (actually the first one).
This will additionally allow graphic-less domain, when no <graphics/>
entries are present in domain XML (previously VNC was always enabled).
---
 src/libxl/libxl_conf.c | 131 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 90 insertions(+), 41 deletions(-)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 477e46d..068a97a 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -347,7 +347,64 @@ error:
 }
 
 static int
-libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
+libxlMakeVNCInfo(libxlDriverPrivatePtr driver,
+        virDomainGraphicsDefPtr l_vfb,
+        libxl_vnc_info *x_vnc)
+{
+    unsigned short port;
+    const char *listenAddr;
+
+    libxl_defbool_set(&x_vnc->enable, 1);
+    /* driver handles selection of free port */
+    libxl_defbool_set(&x_vnc->findunused, 0);
+    if (l_vfb->data.vnc.autoport) {
+
+        if (virPortAllocatorAcquire(driver->reservedVNCPorts, &port) < 0)
+            return -1;
+        if (port == 0) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("Unable to find an unused VNC port"));
+            return -1;
+        }
+        l_vfb->data.vnc.port = port;
+    }
+    x_vnc->display = l_vfb->data.vnc.port - LIBXL_VNC_PORT_MIN;
+
+    listenAddr = virDomainGraphicsListenGetAddress(l_vfb, 0);
+    if (listenAddr) {
+        /* libxl_device_vfb_init() does strdup("127.0.0.1") */
+        VIR_FREE(x_vnc->listen);
+        if ((x_vnc->listen = strdup(listenAddr)) == NULL) {
+            virReportOOMError();
+            return -1;
+        }
+    }
+    return 0;
+}
+
+static int
+libxlMakeSDLInfo(virDomainGraphicsDefPtr l_vfb,
+                        libxl_sdl_info *x_sdl)
+{
+    libxl_defbool_set(&x_sdl->enable, 1);
+    if (l_vfb->data.sdl.display &&
+            (x_sdl->display = strdup(l_vfb->data.sdl.display)) == NULL) {
+        virReportOOMError();
+        return -1;
+    }
+    if (l_vfb->data.sdl.xauth &&
+            (x_sdl->xauthority =
+             strdup(l_vfb->data.sdl.xauth)) == NULL) {
+        virReportOOMError();
+        return -1;
+    }
+    return 0;
+}
+
+static int
+libxlMakeDomBuildInfo(libxlDriverPrivatePtr driver,
+        virDomainDefPtr def,
+        libxl_domain_config *d_config)
 {
     libxl_domain_build_info *b_info = &d_config->b_info;
     int hvm = STREQ(def->os.type, "hvm");
@@ -421,6 +478,34 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
             goto error;
         }
 
+        /* Disable VNC and SDL until explicitly enabled */
+        libxl_defbool_set(&b_info->u.hvm.vnc.enable, 0);
+        libxl_defbool_set(&b_info->u.hvm.sdl.enable, 0);
+
+        for (i = 0; i < def->ngraphics; i++) {
+            switch (def->graphics[i]->type) {
+                case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+                    if (libxl_defbool_val(b_info->u.hvm.vnc.enable))
+                        continue;
+                    if (libxlMakeVNCInfo(driver, def->graphics[i],
+                                &b_info->u.hvm.vnc) < 0)
+                        goto error;
+                    if (def->graphics[i]->data.vnc.keymap &&
+                            (b_info->u.hvm.keymap =
+                             strdup(def->graphics[i]->data.vnc.keymap)) == NULL) {
+                        virReportOOMError();
+                        goto error;
+                    }
+                    break;
+                case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
+                    if (libxl_defbool_val(b_info->u.hvm.sdl.enable))
+                        continue;
+                    if (libxlMakeSDLInfo(def->graphics[i], &b_info->u.hvm.sdl) < 0)
+                        goto error;
+                    break;
+            }
+        }
+
         /*
          * The following comment and calculation were taken directly from
          * libxenlight's internal function libxl_get_required_shadow_memory():
@@ -706,50 +791,14 @@ libxlMakeVfb(libxlDriverPrivatePtr driver,
              virDomainGraphicsDefPtr l_vfb,
              libxl_device_vfb *x_vfb)
 {
-    unsigned short port;
-    const char *listenAddr;
-
     switch (l_vfb->type) {
         case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
-            libxl_defbool_set(&x_vfb->sdl.enable, 1);
-            if (l_vfb->data.sdl.display &&
-                (x_vfb->sdl.display = strdup(l_vfb->data.sdl.display)) == NULL) {
-                virReportOOMError();
-                return -1;
-            }
-            if (l_vfb->data.sdl.xauth &&
-                (x_vfb->sdl.xauthority =
-                    strdup(l_vfb->data.sdl.xauth)) == NULL) {
-                virReportOOMError();
+            if (libxlMakeSDLInfo(l_vfb, &x_vfb->sdl) < 0)
                 return -1;
-            }
             break;
         case  VIR_DOMAIN_GRAPHICS_TYPE_VNC:
-            libxl_defbool_set(&x_vfb->vnc.enable, 1);
-            /* driver handles selection of free port */
-            libxl_defbool_set(&x_vfb->vnc.findunused, 0);
-            if (l_vfb->data.vnc.autoport) {
-
-                if (virPortAllocatorAcquire(driver->reservedVNCPorts, &port) < 0)
-                    return -1;
-                if (port == 0) {
-                    virReportError(VIR_ERR_INTERNAL_ERROR,
-                                   "%s", _("Unable to find an unused VNC port"));
-                    return -1;
-                }
-                l_vfb->data.vnc.port = port;
-            }
-            x_vfb->vnc.display = l_vfb->data.vnc.port - LIBXL_VNC_PORT_MIN;
-
-            listenAddr = virDomainGraphicsListenGetAddress(l_vfb, 0);
-            if (listenAddr) {
-                /* libxl_device_vfb_init() does strdup("127.0.0.1") */
-                VIR_FREE(x_vfb->vnc.listen);
-                if ((x_vfb->vnc.listen = strdup(listenAddr)) == NULL) {
-                    virReportOOMError();
-                    return -1;
-                }
-            }
+            if (libxlMakeVNCInfo(driver, l_vfb, &x_vfb->vnc) < 0)
+                return -1;
             if (l_vfb->data.vnc.keymap &&
                 (x_vfb->keymap =
                     strdup(l_vfb->data.vnc.keymap)) == NULL) {
@@ -920,7 +969,7 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver,
     if (libxlMakeDomCreateInfo(driver, def, &d_config->c_info) < 0)
         return -1;
 
-    if (libxlMakeDomBuildInfo(def, d_config) < 0) {
+    if (libxlMakeDomBuildInfo(driver, def, d_config) < 0) {
         goto error;
     }
 
-- 
1.8.1.4





More information about the libvir-list mailing list