]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Set default emulator in domain_conf.*, rather than the driver.
authorCole Robinson <crobinso@redhat.com>
Tue, 16 Jun 2009 15:42:46 +0000 (15:42 +0000)
committerCole Robinson <crobinso@redhat.com>
Tue, 16 Jun 2009 15:42:46 +0000 (15:42 +0000)
Rather than numerous instances of:

emulator = vm->def->emulator;
if (!emulator)
    emulator = virDomainDefDefaultEmulator(conn, vm->def, driver->caps);
if (!emulator)
    return -1;

Set this value at XML parse time in the domain config, so we can depend on
it for all future emulator accesses. There were unchecked accesses in the
qemu driver that were tripping up on this if no emulator was specified in
the XML, see:

http://www.redhat.com/archives/libvir-list/2008-October/msg00602.html

ChangeLog
src/domain_conf.c
src/domain_conf.h
src/libvirt_private.syms
src/lxc_driver.c
src/qemu_conf.c
src/qemu_driver.c

index 53b2ead52980f298538f39a37c18851ecec9ca4e..1ef6a4600f138a074abed4c48a91a3a85bec94dc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Jun 16 11:33:54 EDT 2009 Cole Robinson <crobinso@redhat.com>
+
+       * src/domain_conf.c src/domain_conf.h src/libvirt_private.syms
+       src/lxc_driver.c src/qemu_conf.c src/qemu_driver.c:
+       Set default emulator in domain_conf.*, rather than the driver.
+
 Tue Jun 16 11:18:00 EDT 2009 Cole Robinson <crobinso@redhat.com>
 
        * src/capabilities.c src/capabilities.h src/libvirt_private.syms
index e83f7765dc5f27c18ca0f0778a155507c320dbc7..c6958206190061537c4eaf36ab2c4cc9ae5bb02e 100644 (file)
@@ -2109,6 +2109,39 @@ int virDomainDiskQSort(const void *a, const void *b)
 }
 
 #ifndef PROXY
+static char *virDomainDefDefaultEmulator(virConnectPtr conn,
+                                         virDomainDefPtr def,
+                                         virCapsPtr caps) {
+    const char *type;
+    const char *emulator;
+    char *retemu;
+
+    type = virDomainVirtTypeToString(def->virtType);
+    if (!type) {
+        virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                             "%s", _("unknown virt type"));
+        return NULL;
+    }
+
+    emulator = virCapabilitiesDefaultGuestEmulator(caps,
+                                                   def->os.type,
+                                                   def->os.arch,
+                                                   type);
+
+    if (!emulator) {
+        virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                             _("no emulator for domain %s os type %s on architecture %s"),
+                             type, def->os.type, def->os.arch);
+        return NULL;
+    }
+
+    retemu = strdup(emulator);
+    if (!retemu)
+        virReportOOMError(conn);
+
+    return retemu;
+}
+
 static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
                                             virCapsPtr caps,
                                             xmlXPathContextPtr ctxt, int flags)
@@ -2358,6 +2391,11 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
     }
 
     def->emulator = virXPathString(conn, "string(./devices/emulator[1])", ctxt);
+    if (!def->emulator && virCapabilitiesIsEmulatorRequired(caps)) {
+        def->emulator = virDomainDefDefaultEmulator(conn, def, caps);
+        if (!def->emulator)
+            goto error;
+    }
 
     /* analysis of the disk devices */
     if ((n = virXPathNodeSet(conn, "./devices/disk", ctxt, &nodes)) < 0) {
@@ -4230,34 +4268,6 @@ int virDiskNameToBusDeviceIndex(const virDomainDiskDefPtr disk,
     return 0;
 }
 
-const char *virDomainDefDefaultEmulator(virConnectPtr conn,
-                                        virDomainDefPtr def,
-                                        virCapsPtr caps) {
-    const char *type;
-    const char *emulator;
-
-    type = virDomainVirtTypeToString(def->virtType);
-    if (!type) {
-        virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
-                             "%s", _("unknown virt type"));
-        return NULL;
-    }
-
-    emulator = virCapabilitiesDefaultGuestEmulator(caps,
-                                                   def->os.type,
-                                                   def->os.arch,
-                                                   type);
-
-    if (!emulator) {
-        virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
-                             _("no emulator for domain %s os type %s on architecture %s"),
-                             type, def->os.type, def->os.arch);
-        return NULL;
-    }
-
-    return emulator;
-}
-
 virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr def)
 {
     int i;
index aef1ec457a2b8229a14da39264c5e16d817d25fb..51310c1769616b6555885fed484f9a2f18fd3f92 100644 (file)
@@ -665,10 +665,6 @@ int virDiskNameToBusDeviceIndex(virDomainDiskDefPtr disk,
                                 int *busIdx,
                                 int *devIdx);
 
-const char *virDomainDefDefaultEmulator(virConnectPtr conn,
-                                        virDomainDefPtr def,
-                                        virCapsPtr caps);
-
 virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr def);
 
 void virDomainObjLock(virDomainObjPtr obj);
index 5ac904f5fc90067b0c69a0ae80cc8e84e10aaf07..f63fa0571ef24bcfb81ec30f38a45eaeff564f20 100644 (file)
@@ -65,7 +65,6 @@ virDomainCpuSetParse;
 virDomainChrDefFree;
 virDomainChrTypeFromString;
 virDomainChrTypeToString;
-virDomainDefDefaultEmulator;
 virDomainDefFormat;
 virDomainDefFree;
 virDomainDefParseFile;
index e798c79b1041fe2e7f6342a839b1344bfb1074aa..35035738ce2ea2f39100399cb898fd54e54c356c 100644 (file)
@@ -758,7 +758,6 @@ static int lxcControllerStart(virConnectPtr conn,
     fd_set keepfd;
     char appPtyStr[30];
     const char *emulator;
-    lxc_driver_t *driver = conn->privateData;
 
     FD_ZERO(&keepfd);
 
@@ -787,10 +786,6 @@ static int lxcControllerStart(virConnectPtr conn,
     snprintf(appPtyStr, sizeof(appPtyStr), "%d", appPty);
 
     emulator = vm->def->emulator;
-    if (!emulator)
-        emulator = virDomainDefDefaultEmulator(conn, vm->def, driver->caps);
-    if (!emulator)
-        return -1;
 
     ADD_ARG_LIT(emulator);
     ADD_ARG_LIT("--name");
index 8c657be28f59b70f4772d32dd7238f3b5d9aec36..ff11d2da55321f329ea0027cf569b0f401c09102 100644 (file)
@@ -920,11 +920,6 @@ int qemudBuildCommandLine(virConnectPtr conn,
     }
 
     emulator = def->emulator;
-    if (!emulator)
-        emulator = virDomainDefDefaultEmulator(conn, def, driver->caps);
-    if (!emulator)
-        return -1;
-
 
     /* Need to explicitly disable KQEMU if
      * 1. Arch matches host arch
index 665bc8d68c4dbb0c242c390fa5b68e25f7946185..d3eb3adafdd272400f7551cd6fd5797e8d767bc9 100644 (file)
@@ -1377,10 +1377,6 @@ static int qemudStartVMDaemon(virConnectPtr conn,
         goto cleanup;
 
     emulator = vm->def->emulator;
-    if (!emulator)
-        emulator = virDomainDefDefaultEmulator(conn, vm->def, driver->caps);
-    if (!emulator)
-        goto cleanup;
 
     /* Make sure the binary we are about to try exec'ing exists.
      * Technically we could catch the exec() failure, but that's
@@ -3425,10 +3421,6 @@ static char *qemuDomainXMLToNative(virConnectPtr conn,
             def->graphics[i]->data.vnc.port = 5900;
     }
     emulator = def->emulator;
-    if (!emulator)
-        emulator = virDomainDefDefaultEmulator(conn, def, driver->caps);
-    if (!emulator)
-        goto cleanup;
 
     /* Make sure the binary we are about to try exec'ing exists.
      * Technically we could catch the exec() failure, but that's