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
This commit is contained in:
Mark McLoughlin 2009-07-23 18:31:34 +01:00
parent be291b330a
commit c14c6b083e
3 changed files with 37 additions and 1 deletions

View File

@ -401,7 +401,7 @@ error:
return -1;
}
static int
int
qemudProbeMachineTypes(const char *binary,
virCapsGuestMachinePtr **machines,
int *nmachines)

View File

@ -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,

View File

@ -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);