From c14c6b083e35e30dfecf40672059cd083275d689 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Thu, 23 Jul 2009 18:31:34 +0100 Subject: [PATCH] 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 --- src/qemu_conf.c | 2 +- src/qemu_conf.h | 4 ++++ src/qemu_driver.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) 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);