于 2011年01月14日 03:10, Eric Blake 写道:
* src/qemu/qemu_capabilities.h (qemuCapsParseDeviceStr): New
prototype.
* src/qemu/qemu_capabilities.c (qemuCapsParsePCIDeviceStrs)
Rename and split...
(qemuCapsExtractDeviceStr, qemuCapsParseDeviceStr): ...to make it
easier to add and test device-specific checks.
(qemuCapsExtractVersionInfo): Update caller.
* tests/qemuhelptest.c (testHelpStrParsing): Also test parsing of
device-related flags.
(mymain): Update expected flags.
* tests/qemuhelpdata/qemu-0.12.1-device: New file.
* tests/qemuhelpdata/qemu-kvm-0.12.1.2-rhel60-device: New file.
* tests/qemuhelpdata/qemu-kvm-0.12.3-device: New file.
* tests/qemuhelpdata/qemu-kvm-0.13.0-device: New file.
---
src/qemu/qemu_capabilities.c | 41 ++++++++---
src/qemu/qemu_capabilities.h | 2 +
tests/qemuhelpdata/qemu-kvm-0.12.1.2-rhel60-device | 57 ++++++++++++++++
tests/qemuhelpdata/qemu-kvm-0.13.0-device | 70 ++++++++++++++++++++
tests/qemuhelptest.c | 48 ++++++++++----
5 files changed, 195 insertions(+), 23 deletions(-)
create mode 100644 tests/qemuhelpdata/qemu-0.12.1-device
create mode 100644 tests/qemuhelpdata/qemu-kvm-0.12.1.2-rhel60-device
create mode 100644 tests/qemuhelpdata/qemu-kvm-0.12.3-device
create mode 100644 tests/qemuhelpdata/qemu-kvm-0.13.0-device
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 9bab317..f967255 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -1032,28 +1032,46 @@ fail:
return -1;
}
-static void
-qemuCapsParsePCIDeviceStrs(const char *qemu,
- unsigned long long *flags)
+static int
+qemuCapsExtractDeviceStr(const char *qemu,
+ unsigned long long *flags)
{
- char *pciassign = NULL;
+ char *output = NULL;
virCommandPtr cmd;
+ int ret = -1;
- cmd = virCommandNewArgList(qemu, "-device", "pci-assign,?",
NULL);
+ /* Cram together all device-related queries into one invocation;
+ * the output format makes it possible to distinguish what we
+ * need. Unrecognized '-device bogus,?' cause an error in
+ * isolation, but are silently ignored in combination with
+ * '-device ?'. */
+ cmd = virCommandNewArgList(qemu,
+ "-device", "pci-assign,?",
+ NULL);
virCommandAddEnvPassCommon(cmd);
/* qemu -help goes to stdout, but qemu -device ? goes to stderr. */
- virCommandSetErrorBuffer(cmd,&pciassign);
+ virCommandSetErrorBuffer(cmd,&output);
virCommandClearCaps(cmd);
if (virCommandRun(cmd, NULL)< 0)
goto cleanup;
- if (strstr(pciassign, "pci-assign.configfd"))
- *flags |= QEMUD_CMD_FLAG_PCI_CONFIGFD;
+ ret = qemuCapsParseDeviceStr(output, flags);
cleanup:
- VIR_FREE(pciassign);
+ VIR_FREE(output);
virCommandFree(cmd);
+ return ret;
+}
+
+
+int
+qemuCapsParseDeviceStr(const char *str, unsigned long long *flags)
+{
+ if (strstr(str, "pci-assign.configfd"))
+ *flags |= QEMUD_CMD_FLAG_PCI_CONFIGFD;
+
+ return 0;
}
int qemuCapsExtractVersionInfo(const char *qemu,
@@ -1092,8 +1110,9 @@ int qemuCapsExtractVersionInfo(const char *qemu,
&version,&is_kvm,&kvm_version) == -1)
goto cleanup;
- if (flags& QEMUD_CMD_FLAG_DEVICE)
- qemuCapsParsePCIDeviceStrs(qemu,&flags);
+ if ((flags& QEMUD_CMD_FLAG_DEVICE)&&
+ qemuCapsExtractDeviceStr(qemu,&flags)< 0)
+ goto cleanup;
This causes problem? older qemu which doesn't support
"-device pci-assign,?" or "-device virtio-blk-pci,?"
won't work anymore. (raised by nikunj in #virt).
Regards
Osier