From: Mark McLoughlin Date: Thu, 23 Jul 2009 17:31:34 +0000 (+0100) Subject: Probe QEMU directly for machine aliases if not found in capabilties X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=c14c6b083e35e30dfecf40672059cd083275d689;p=libvirt.git Probe QEMU directly for machine aliases if not found in capabilties Not all possible emulators are actually in the capabilities, so if we don't find the supplied emulator we should probe it directly for machine types. * src/qemu_driver.c: add qemudCanonicalizeMachineDirect() to directly probe an emulator for the canonical machine type --- diff --git a/src/qemu_conf.c b/src/qemu_conf.c index 598d008d5b..a3986dff3d 100644 --- a/src/qemu_conf.c +++ b/src/qemu_conf.c @@ -401,7 +401,7 @@ error: return -1; } -static int +int qemudProbeMachineTypes(const char *binary, virCapsGuestMachinePtr **machines, int *nmachines) diff --git a/src/qemu_conf.h b/src/qemu_conf.h index e753ba07ea..316a787e98 100644 --- a/src/qemu_conf.h +++ b/src/qemu_conf.h @@ -168,6 +168,10 @@ int qemuBuildNicStr (virConnectPtr conn, int qemuAssignNetNames (virDomainDefPtr def, virDomainNetDefPtr net); +int qemudProbeMachineTypes (const char *binary, + virCapsGuestMachinePtr **machines, + int *nmachines); + virDomainDefPtr qemuParseCommandLine(virConnectPtr conn, virCapsPtr caps, const char **progenv, diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 3af35563e9..d5db9aebf2 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -4286,6 +4286,34 @@ qemudCanonicalizeMachineFromInfo(virDomainDefPtr def, return 0; } +static int +qemudCanonicalizeMachineDirect(virDomainDefPtr def, char **canonical) +{ + virCapsGuestMachinePtr *machines = NULL; + int i, nmachines = 0; + + if (qemudProbeMachineTypes(def->emulator, &machines, &nmachines) < 0) { + virReportOOMError(NULL); + return -1; + } + + for (i = 0; i < nmachines; i++) { + if (!machines[i]->canonical) + continue; + + if (strcmp(def->os.machine, machines[i]->name) != 0) + continue; + + *canonical = machines[i]->canonical; + machines[i]->canonical = NULL; + break; + } + + virCapabilitiesFreeMachines(machines, nmachines); + + return 0; +} + static int qemudCanonicalizeMachine(virConnectPtr conn, virDomainDefPtr def) { @@ -4323,6 +4351,10 @@ qemudCanonicalizeMachine(virConnectPtr conn, virDomainDefPtr def) goto out; } } + + if (qemudCanonicalizeMachineDirect(def, &canonical) < 0) + return -1; + out: if (canonical) { VIR_FREE(def->os.machine);