]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Copy console definition from serial
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 15 Nov 2011 08:01:31 +0000 (09:01 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 21 Nov 2011 13:53:13 +0000 (14:53 +0100)
Now, when we support multiple consoles per domain,
the vm->def->console[0] can still remain an alias
for vm->def->serial[0]; However, we need to copy
it's source definition as well otherwise we'll regress
on virDomainOpenConsole.

src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_process.c

index 452c8b28ea9ab4a1bb5a0e0b687db396282acf7f..e98625307f36c37d88ae60e2eb99da8c1cf13def 100644 (file)
@@ -956,6 +956,82 @@ virDomainChrSourceDefClear(virDomainChrSourceDefPtr def)
     }
 }
 
+/* Deep copies the contents of src into dest.  Return -1 and report
+ * error on failure.  */
+int
+virDomainChrSourceDefCopy(virDomainChrSourceDefPtr dest,
+                          virDomainChrSourceDefPtr src)
+{
+    if (!dest || !src)
+        return -1;
+
+    virDomainChrSourceDefClear(dest);
+
+    switch (src->type) {
+    case VIR_DOMAIN_CHR_TYPE_PTY:
+    case VIR_DOMAIN_CHR_TYPE_DEV:
+    case VIR_DOMAIN_CHR_TYPE_FILE:
+    case VIR_DOMAIN_CHR_TYPE_PIPE:
+        if (src->data.file.path &&
+            !(dest->data.file.path = strdup(src->data.file.path))) {
+            virReportOOMError();
+            return -1;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_TYPE_UDP:
+        if (src->data.udp.bindHost &&
+            !(dest->data.udp.bindHost = strdup(src->data.udp.bindHost))) {
+            virReportOOMError();
+            return -1;
+        }
+
+        if (src->data.udp.bindService &&
+            !(dest->data.udp.bindService = strdup(src->data.udp.bindService))) {
+            virReportOOMError();
+            return -1;
+        }
+
+        if (src->data.udp.connectHost &&
+            !(dest->data.udp.connectHost = strdup(src->data.udp.connectHost))) {
+            virReportOOMError();
+            return -1;
+        }
+
+
+        if (src->data.udp.connectService &&
+            !(dest->data.udp.connectService = strdup(src->data.udp.connectService))) {
+            virReportOOMError();
+            return -1;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_TYPE_TCP:
+        if (src->data.tcp.host &&
+            !(dest->data.tcp.host = strdup(src->data.tcp.host))) {
+            virReportOOMError();
+            return -1;
+        }
+
+        if (src->data.tcp.service &&
+            !(dest->data.tcp.service = strdup(src->data.tcp.service))) {
+            virReportOOMError();
+            return -1;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_TYPE_UNIX:
+        if (src->data.nix.path &&
+            !(dest->data.nix.path = strdup(src->data.nix.path))) {
+            virReportOOMError();
+            return -1;
+        }
+        break;
+    }
+
+    return 0;
+}
+
 void virDomainChrSourceDefFree(virDomainChrSourceDefPtr def)
 {
     if (!def)
index 4e86d30eab0e9bf9fbcfb40244393c2129f4f81e..481dfc6d0bf6bf33d0563034dcc4872ed41c8bef 100644 (file)
@@ -1662,6 +1662,8 @@ void virDomainNetDefFree(virDomainNetDefPtr def);
 void virDomainSmartcardDefFree(virDomainSmartcardDefPtr def);
 void virDomainChrDefFree(virDomainChrDefPtr def);
 void virDomainChrSourceDefFree(virDomainChrSourceDefPtr def);
+int virDomainChrSourceDefCopy(virDomainChrSourceDefPtr src,
+                              virDomainChrSourceDefPtr dest);
 void virDomainSoundDefFree(virDomainSoundDefPtr def);
 void virDomainMemballoonDefFree(virDomainMemballoonDefPtr def);
 void virDomainWatchdogDefFree(virDomainWatchdogDefPtr def);
index f4e25c1760856babd3f46cabf27b3fff1fa415ab..e5784f579c746b7f443cdedf9e358024c94ee00d 100644 (file)
@@ -242,6 +242,7 @@ virDomainChrConsoleTargetTypeToString;
 virDomainChrDefForeach;
 virDomainChrDefFree;
 virDomainChrDefNew;
+virDomainChrSourceDefCopy;
 virDomainChrSourceDefFree;
 virDomainChrSpicevmcTypeFromString;
 virDomainChrSpicevmcTypeToString;
index 04fcdefff04aa00de7070027349a3eebdda32a8a..2563f97ba2ff51581610987ccfca4181ee64f608 100644 (file)
@@ -1163,11 +1163,22 @@ qemuProcessFindCharDevicePTYs(virDomainObjPtr vm,
 
     for (i = 0 ; i < vm->def->nconsoles ; i++) {
         virDomainChrDefPtr chr = vm->def->consoles[i];
-        if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY &&
-            chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO) {
-            if ((ret = qemuProcessExtractTTYPath(output, &offset,
-                                                 &chr->source.data.file.path)) != 0)
+        /* For historical reasons, console[0] can be just an alias
+         * for serial[0]; That's why we need to update it as well */
+        if (i == 0 && vm->def->nserials &&
+            chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
+            chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL) {
+            if ((ret = virDomainChrSourceDefCopy(&chr->source,
+                                                 &((vm->def->serials[0])->source))) != 0)
                 return ret;
+            chr->source.type = VIR_DOMAIN_CHR_TYPE_PTY;
+        } else {
+            if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY &&
+                chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO) {
+                if ((ret = qemuProcessExtractTTYPath(output, &offset,
+                                                     &chr->source.data.file.path)) != 0)
+                    return ret;
+            }
         }
     }