]> xenbits.xensource.com Git - libvirt.git/commitdiff
Changes needed for multiple graphics adapters
authorDaniel Veillard <veillard@redhat.com>
Thu, 7 May 2009 07:27:49 +0000 (07:27 +0000)
committerDaniel Veillard <veillard@redhat.com>
Thu, 7 May 2009 07:27:49 +0000 (07:27 +0000)
* src/domain_conf.c src/domain_conf.h: parse and save multiple
  graphics elements instead of one, patch by Pritesh Kothari
* src/qemu_conf.c src/qemu_driver.c: adapt the qemu/kvm driver for
  the new structures, patch by Pritesh Kothari
* src/xend_internal.c src/xm_internal.c: same thing for Xen drivers
Daniel

ChangeLog
src/domain_conf.c
src/domain_conf.h
src/qemu_conf.c
src/qemu_driver.c
src/xend_internal.c
src/xm_internal.c

index f222ff21f8a9d859685c9d69b72e3af2f0942b8d..2c5a790d59d3828b9c2c9fe45532812b1a29653e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu May  7 09:24:47 CEST 2009 Daniel Veillard <veillard@redhat.com>
+
+       * src/domain_conf.c src/domain_conf.h: parse and save multiple
+         graphics elements instead of one, patch by Pritesh Kothari
+       * src/qemu_conf.c src/qemu_driver.c: adapt the qemu/kvm driver for
+         the new structures, patch by Pritesh Kothari
+       * src/xend_internal.c src/xm_internal.c: same thing for Xen drivers
+
 Thu May  7 09:16:05 CEST 2009 Guido Günther <agx@sigxcpu.org>
 
        * src/lxc_controller.c (main): don't crash when called without
index dde4020642f264ad5f196a6bbd6afe8ee30c001c..ed4b8e5744d676de2266110744803bdfdc0c5385 100644 (file)
@@ -408,7 +408,9 @@ void virDomainDefFree(virDomainDefPtr def)
     if (!def)
         return;
 
-    virDomainGraphicsDefFree(def->graphics);
+    for (i = 0 ; i < def->ngraphics ; i++)
+        virDomainGraphicsDefFree(def->graphics[i]);
+    VIR_FREE(def->graphics);
 
     for (i = 0 ; i < def->ninputs ; i++)
         virDomainInputDefFree(def->inputs[i]);
@@ -2422,19 +2424,21 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
                              "%s", _("cannot extract graphics devices"));
         goto error;
     }
-    if (n > 0) {
+    if (n && VIR_ALLOC_N(def->graphics, n) < 0)
+        goto no_memory;
+    for (i = 0 ; i < n ; i++) {
         virDomainGraphicsDefPtr graphics = virDomainGraphicsDefParseXML(conn,
-                                                                        nodes[0],
+                                                                        nodes[i],
                                                                         flags);
         if (!graphics)
             goto error;
 
-        def->graphics = graphics;
+        def->graphics[def->ngraphics++] = graphics;
     }
     VIR_FREE(nodes);
 
     /* If graphics are enabled, there's an implicit PS2 mouse */
-    if (def->graphics != NULL) {
+    if (def->ngraphics > 0) {
         virDomainInputDefPtr input;
 
         if (VIR_ALLOC(input) < 0) {
@@ -3506,7 +3510,7 @@ char *virDomainDefFormat(virConnectPtr conn,
             virDomainInputDefFormat(conn, &buf, def->inputs[n]) < 0)
             goto cleanup;
 
-    if (def->graphics) {
+    if (def->ngraphics > 0) {
         /* If graphics is enabled, add the implicit mouse */
         virDomainInputDef autoInput = {
             VIR_DOMAIN_INPUT_TYPE_MOUSE,
@@ -3517,8 +3521,9 @@ char *virDomainDefFormat(virConnectPtr conn,
         if (virDomainInputDefFormat(conn, &buf, &autoInput) < 0)
             goto cleanup;
 
-        if (virDomainGraphicsDefFormat(conn, &buf, def, def->graphics, flags) < 0)
-            goto cleanup;
+        for (n = 0 ; n < def->ngraphics ; n++)
+            if (virDomainGraphicsDefFormat(conn, &buf, def, def->graphics[n], flags) < 0)
+                goto cleanup;
     }
 
     for (n = 0 ; n < def->nsounds ; n++)
index d4e7442d4e3e32930aa18af4d859c2a286a54732..84fc4778579b18d242601b67b0953f1d15c818cd 100644 (file)
@@ -456,8 +456,8 @@ struct _virDomainDef {
 
     int localtime;
 
-    /* Only 1 */
-    virDomainGraphicsDefPtr graphics;
+    int ngraphics;
+    virDomainGraphicsDefPtr *graphics;
 
     int ndisks;
     virDomainDiskDefPtr *disks;
index 64415ec040e5574aa6e916a56334e1f71abf669e..07c7c44cd0f536bda4a4bf9f901cd2a62802b90f 100644 (file)
@@ -1348,21 +1348,21 @@ int qemudBuildCommandLine(virConnectPtr conn,
         }
     }
 
-    if (def->graphics &&
-        def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
+    if ((def->ngraphics == 1) &&
+        def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
         virBuffer opt = VIR_BUFFER_INITIALIZER;
         char *optstr;
 
         if (qemuCmdFlags & QEMUD_CMD_FLAG_VNC_COLON) {
-            if (def->graphics->data.vnc.listenAddr)
-                virBufferAdd(&opt, def->graphics->data.vnc.listenAddr, -1);
+            if (def->graphics[0]->data.vnc.listenAddr)
+                virBufferAdd(&opt, def->graphics[0]->data.vnc.listenAddr, -1);
             else if (driver->vncListen)
                 virBufferAdd(&opt, driver->vncListen, -1);
 
             virBufferVSprintf(&opt, ":%d",
-                              def->graphics->data.vnc.port - 5900);
+                              def->graphics[0]->data.vnc.port - 5900);
 
-            if (def->graphics->data.vnc.passwd ||
+            if (def->graphics[0]->data.vnc.passwd ||
                 driver->vncPassword)
                 virBufferAddLit(&opt, ",password");
 
@@ -1387,7 +1387,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
             }
         } else {
             virBufferVSprintf(&opt, "%d",
-                              def->graphics->data.vnc.port - 5900);
+                              def->graphics[0]->data.vnc.port - 5900);
         }
         if (virBufferError(&opt))
             goto no_memory;
@@ -1396,22 +1396,22 @@ int qemudBuildCommandLine(virConnectPtr conn,
 
         ADD_ARG_LIT("-vnc");
         ADD_ARG(optstr);
-        if (def->graphics->data.vnc.keymap) {
+        if (def->graphics[0]->data.vnc.keymap) {
             ADD_ARG_LIT("-k");
-            ADD_ARG_LIT(def->graphics->data.vnc.keymap);
+            ADD_ARG_LIT(def->graphics[0]->data.vnc.keymap);
         }
-    } else if (def->graphics &&
-               def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
+    } else if ((def->ngraphics == 1) &&
+               def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
         char *xauth = NULL;
         char *display = NULL;
 
-        if (def->graphics->data.sdl.xauth &&
+        if (def->graphics[0]->data.sdl.xauth &&
             virAsprintf(&xauth, "XAUTHORITY=%s",
-                        def->graphics->data.sdl.xauth) < 0)
+                        def->graphics[0]->data.sdl.xauth) < 0)
             goto no_memory;
-        if (def->graphics->data.sdl.display &&
+        if (def->graphics[0]->data.sdl.display &&
             virAsprintf(&display, "DISPLAY=%s",
-                        def->graphics->data.sdl.display) < 0) {
+                        def->graphics[0]->data.sdl.display) < 0) {
             VIR_FREE(xauth);
             goto no_memory;
         }
@@ -1420,7 +1420,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
             ADD_ENV(xauth);
         if (display)
             ADD_ENV(display);
-        if (def->graphics->data.sdl.fullscreen)
+        if (def->graphics[0]->data.sdl.fullscreen)
             ADD_ARG_LIT("-full-screen");
     }
 
index 59312c022e8f50d3c8333e185b5064061541f9c9..acf08d49fbf3cc8be5be351901e2eda6a43fb3dc 100644 (file)
@@ -1140,13 +1140,13 @@ qemudInitPasswords(virConnectPtr conn,
      * for that yet...
      */
 
-    if (vm->def->graphics &&
-        vm->def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
-        (vm->def->graphics->data.vnc.passwd || driver->vncPassword)) {
+    if ((vm->def->ngraphics == 1) &&
+        vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+        (vm->def->graphics[0]->data.vnc.passwd || driver->vncPassword)) {
 
         if (qemudMonitorCommandExtra(vm, "change vnc password",
-                                     vm->def->graphics->data.vnc.passwd ?
-                                     vm->def->graphics->data.vnc.passwd :
+                                     vm->def->graphics[0]->data.vnc.passwd ?
+                                     vm->def->graphics[0]->data.vnc.passwd :
                                      driver->vncPassword,
                                      QEMU_PASSWD_PROMPT,
                                      &info) < 0) {
@@ -1338,16 +1338,16 @@ static int qemudStartVMDaemon(virConnectPtr conn,
         driver->securityDriver->domainGenSecurityLabel(conn, vm) < 0)
         return -1;
 
-    if (vm->def->graphics &&
-        vm->def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
-        vm->def->graphics->data.vnc.autoport) {
+    if ((vm->def->ngraphics == 1) &&
+        vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+        vm->def->graphics[0]->data.vnc.autoport) {
         int port = qemudNextFreeVNCPort(driver);
         if (port < 0) {
             qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
                              "%s", _("Unable to find an unused VNC port"));
             goto cleanup;
         }
-        vm->def->graphics->data.vnc.port = port;
+        vm->def->graphics[0]->data.vnc.port = port;
     }
 
     if (virFileMakePath(driver->logDir) < 0) {
@@ -1504,10 +1504,10 @@ cleanup:
         VIR_FREE(vm->def->seclabel.label);
         VIR_FREE(vm->def->seclabel.imagelabel);
     }
-    if (vm->def->graphics &&
-        vm->def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
-        vm->def->graphics->data.vnc.autoport)
-        vm->def->graphics->data.vnc.port = -1;
+    if ((vm->def->ngraphics == 1) &&
+        vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+        vm->def->graphics[0]->data.vnc.autoport)
+        vm->def->graphics[0]->data.vnc.port = -1;
     if (vm->logfile != -1) {
         close(vm->logfile);
         vm->logfile = -1;
index 4b327c4e75440c76dc10e083c4fa1cf95df10c5f..ffc0d061623bfbe754bfe41ea18c60c0159c2f6a 100644 (file)
@@ -2023,7 +2023,11 @@ xenDaemonParseSxprGraphicsOld(virConnectPtr conn,
             !(graphics->data.vnc.keymap = strdup(keymap)))
             goto no_memory;
 
-        def->graphics = graphics;
+        if (VIR_ALLOC_N(def->graphics, 1) < 0)
+            goto no_memory;
+        def->graphics[0] = graphics;
+        def->ngraphics = 1;
+        graphics = NULL;
     } else if ((tmp = sexpr_fmt_node(root, "domain/image/%s/sdl", hvm ? "hvm" : "linux")) &&
                tmp[0] == '1') {
         /* Graphics device (HVM, or old (pre-3.0.4) style PV sdl config) */
@@ -2041,7 +2045,11 @@ xenDaemonParseSxprGraphicsOld(virConnectPtr conn,
             !(graphics->data.sdl.xauth = strdup(xauth)))
             goto no_memory;
 
-        def->graphics = graphics;
+        if (VIR_ALLOC_N(def->graphics, 1) < 0)
+            goto no_memory;
+        def->graphics[0] = graphics;
+        def->ngraphics = 1;
+        graphics = NULL;
     }
 
     return 0;
@@ -2130,7 +2138,11 @@ xenDaemonParseSxprGraphicsNew(virConnectPtr conn,
                     goto no_memory;
             }
 
-            def->graphics = graphics;
+            if (VIR_ALLOC_N(def->graphics, 1) < 0)
+                goto no_memory;
+            def->graphics[0] = graphics;
+            def->ngraphics = 1;
+            graphics = NULL;
             break;
         }
     }
@@ -2447,7 +2459,7 @@ xenDaemonParseSxpr(virConnectPtr conn,
         goto error;
 
     /* Graphics device (HVM <= 3.0.4, or PV <= 3.0.3) vnc config */
-    if (!def->graphics &&
+    if ((def->ngraphics == 0) &&
         xenDaemonParseSxprGraphicsOld(conn, def, root, hvm, xendConfigVersion) < 0)
         goto error;
 
@@ -5731,8 +5743,9 @@ xenDaemonFormatSxpr(virConnectPtr conn,
         /* PV graphics for xen <= 3.0.4, or HVM graphics for xen <= 3.1.0 */
         if ((!hvm && xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF) ||
             (hvm && xendConfigVersion < 4)) {
-            if (def->graphics &&
-                xenDaemonFormatSxprGraphicsOld(conn, def->graphics, &buf, xendConfigVersion) < 0)
+            if ((def->ngraphics == 1) &&
+                xenDaemonFormatSxprGraphicsOld(conn, def->graphics[0],
+                                               &buf, xendConfigVersion) < 0)
                 goto error;
         }
 
@@ -5756,8 +5769,8 @@ xenDaemonFormatSxpr(virConnectPtr conn,
      * or HVM graphics config xen >= 3.0.5 */
     if ((xendConfigVersion >= XEND_CONFIG_MIN_VERS_PVFB_NEWCONF && !hvm) ||
         (xendConfigVersion >= 4 && hvm)) {
-        if (def->graphics &&
-            xenDaemonFormatSxprGraphicsNew(conn, def->graphics, &buf) < 0)
+        if ((def->ngraphics == 1) &&
+            xenDaemonFormatSxprGraphicsNew(conn, def->graphics[0], &buf) < 0)
             goto error;
     }
 
index 38ef9b2e11e0b3582664d887e1ae333f1855bb52..95f70b0ccb124830b91f030488cf2daafa49ded2 100644 (file)
@@ -1257,7 +1257,10 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
             if (xenXMConfigCopyStringOpt(conn, conf, "keymap", &graphics->data.vnc.keymap) < 0)
                 goto cleanup;
 
-            def->graphics = graphics;
+            if (VIR_ALLOC_N(def->graphics, 1) < 0)
+                goto no_memory;
+            def->graphics[0] = graphics;
+            def->ngraphics = 1;
             graphics = NULL;
         } else {
             if (xenXMConfigGetBool(conn, conf, "sdl", &val, 0) < 0)
@@ -1270,7 +1273,10 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
                     goto cleanup;
                 if (xenXMConfigCopyStringOpt(conn, conf, "xauthority", &graphics->data.sdl.xauth) < 0)
                     goto cleanup;
-                def->graphics = graphics;
+                if (VIR_ALLOC_N(def->graphics, 1) < 0)
+                    goto no_memory;
+                def->graphics[0] = graphics;
+                def->ngraphics = 1;
                 graphics = NULL;
             }
         }
@@ -1339,7 +1345,10 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
                     nextkey++;
                 key = nextkey;
             }
-            def->graphics = graphics;
+            if (VIR_ALLOC_N(def->graphics, 1) < 0)
+                goto no_memory;
+            def->graphics[0] = graphics;
+            def->ngraphics = 1;
             graphics = NULL;
         }
     }
@@ -2305,20 +2314,20 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
         }
     }
 
-    if (def->graphics) {
+    if (def->ngraphics == 1) {
         if (priv->xendConfigVersion < (hvm ? 4 : XEND_CONFIG_MIN_VERS_PVFB_NEWCONF)) {
-            if (def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
+            if (def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
                 if (xenXMConfigSetInt(conf, "sdl", 1) < 0)
                     goto no_memory;
                 if (xenXMConfigSetInt(conf, "vnc", 0) < 0)
                     goto no_memory;
-                if (def->graphics->data.sdl.display &&
+                if (def->graphics[0]->data.sdl.display &&
                     xenXMConfigSetString(conf, "display",
-                                         def->graphics->data.sdl.display) < 0)
+                                     def->graphics[0]->data.sdl.display) < 0)
                     goto no_memory;
-                if (def->graphics->data.sdl.xauth &&
+                if (def->graphics[0]->data.sdl.xauth &&
                     xenXMConfigSetString(conf, "xauthority",
-                                         def->graphics->data.sdl.xauth) < 0)
+                                         def->graphics[0]->data.sdl.xauth) < 0)
                     goto no_memory;
             } else {
                 if (xenXMConfigSetInt(conf, "sdl", 0) < 0)
@@ -2326,53 +2335,53 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
                 if (xenXMConfigSetInt(conf, "vnc", 1) < 0)
                     goto no_memory;
                 if (xenXMConfigSetInt(conf, "vncunused",
-                                      def->graphics->data.vnc.autoport ? 1 : 0) < 0)
+                              def->graphics[0]->data.vnc.autoport ? 1 : 0) < 0)
                     goto no_memory;
-                if (!def->graphics->data.vnc.autoport &&
+                if (!def->graphics[0]->data.vnc.autoport &&
                     xenXMConfigSetInt(conf, "vncdisplay",
-                                      def->graphics->data.vnc.port - 5900) < 0)
+                                  def->graphics[0]->data.vnc.port - 5900) < 0)
                     goto no_memory;
-                if (def->graphics->data.vnc.listenAddr &&
+                if (def->graphics[0]->data.vnc.listenAddr &&
                     xenXMConfigSetString(conf, "vnclisten",
-                                         def->graphics->data.vnc.listenAddr) < 0)
+                                    def->graphics[0]->data.vnc.listenAddr) < 0)
                     goto no_memory;
-                if (def->graphics->data.vnc.passwd &&
+                if (def->graphics[0]->data.vnc.passwd &&
                     xenXMConfigSetString(conf, "vncpasswd",
-                                         def->graphics->data.vnc.passwd) < 0)
+                                        def->graphics[0]->data.vnc.passwd) < 0)
                     goto no_memory;
-                if (def->graphics->data.vnc.keymap &&
+                if (def->graphics[0]->data.vnc.keymap &&
                     xenXMConfigSetString(conf, "keymap",
-                                         def->graphics->data.vnc.keymap) < 0)
+                                        def->graphics[0]->data.vnc.keymap) < 0)
                     goto no_memory;
             }
         } else {
             virConfValuePtr vfb, disp;
             char *vfbstr = NULL;
             virBuffer buf = VIR_BUFFER_INITIALIZER;
-            if (def->graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
+            if (def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
                 virBufferAddLit(&buf, "type=sdl");
-                if (def->graphics->data.sdl.display)
+                if (def->graphics[0]->data.sdl.display)
                     virBufferVSprintf(&buf, ",display=%s",
-                                      def->graphics->data.sdl.display);
-                if (def->graphics->data.sdl.xauth)
+                                      def->graphics[0]->data.sdl.display);
+                if (def->graphics[0]->data.sdl.xauth)
                     virBufferVSprintf(&buf, ",xauthority=%s",
-                                      def->graphics->data.sdl.xauth);
+                                      def->graphics[0]->data.sdl.xauth);
             } else {
                 virBufferAddLit(&buf, "type=vnc");
                 virBufferVSprintf(&buf, ",vncunused=%d",
-                                  def->graphics->data.vnc.autoport ? 1 : 0);
-                if (!def->graphics->data.vnc.autoport)
+                                  def->graphics[0]->data.vnc.autoport ? 1 : 0);
+                if (!def->graphics[0]->data.vnc.autoport)
                     virBufferVSprintf(&buf, ",vncdisplay=%d",
-                                      def->graphics->data.vnc.port - 5900);
-                if (def->graphics->data.vnc.listenAddr)
+                                      def->graphics[0]->data.vnc.port - 5900);
+                if (def->graphics[0]->data.vnc.listenAddr)
                     virBufferVSprintf(&buf, ",vnclisten=%s",
-                                      def->graphics->data.vnc.listenAddr);
-                if (def->graphics->data.vnc.passwd)
+                                      def->graphics[0]->data.vnc.listenAddr);
+                if (def->graphics[0]->data.vnc.passwd)
                     virBufferVSprintf(&buf, ",vncpasswd=%s",
-                                      def->graphics->data.vnc.passwd);
-                if (def->graphics->data.vnc.keymap)
+                                      def->graphics[0]->data.vnc.passwd);
+                if (def->graphics[0]->data.vnc.keymap)
                     virBufferVSprintf(&buf, ",keymap=%s",
-                                      def->graphics->data.vnc.keymap);
+                                      def->graphics[0]->data.vnc.keymap);
             }
             if (virBufferError(&buf))
                 goto no_memory;