
On Thu, 2009-09-24 at 16:00 +0100, Daniel P. Berrange wrote:
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Add new API qemuMonitorAddPCIDisk() * src/qemu/qemu_driver.c: Convert over to using the new qemuMonitorAddPCIDisk() method, and remove now obsolete qemudEscape() method --- src/qemu/qemu_driver.c | 130 ++--------------------------------------- src/qemu/qemu_monitor_text.c | 55 ++++++++++++++++++ src/qemu/qemu_monitor_text.h | 13 ++++ 3 files changed, 75 insertions(+), 123 deletions(-)
...
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index 290dcce..765a482 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -1437,6 +1437,61 @@ cleanup: }
+int qemuMonitorAddPCIDisk(const virDomainObjPtr vm, + const char *path, + const char *bus, + unsigned *guestDomain, + unsigned *guestBus, + unsigned *guestSlot) { + char *cmd = NULL; + char *reply = NULL; + char *safe_path = NULL; + int tryOldSyntax = 0; + int ret = -1; + + safe_path = qemudEscapeMonitorArg(path); + if (!safe_path) { + virReportOOMError(NULL); + return -1; + } + +try_command: + if (virAsprintf(&cmd, "pci_add %s storage file=%s,if=%s", + (tryOldSyntax ? "0": "pci_addr=auto"), safe_path, bus) < 0) { + virReportOOMError(NULL); + goto cleanup; + } + + if (qemudMonitorCommand(vm, cmd, &reply) < 0) { + qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED, + _("cannot attach %s disk %s"), bus, path); + goto cleanup; + } + + if (qemuMonitorParsePciAddReply(vm, reply, + guestDomain, guestBus, guestSlot) < 0) { + if (!tryOldSyntax && strstr(reply, "invalid char in expression")) { + VIR_FREE(reply); + VIR_FREE(cmd); + tryOldSyntax = 1; + goto try_command; + } + + qemudReportError (NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED, + _("adding %s disk failed %s: %s"), bus, path, reply); + goto cleanup; + } + + ret = 0; + +cleanup: + VIR_FREE(cmd); + VIR_FREE(reply); + return ret; +}
safe_path is leaked Otherwise ACK Cheers, Mark.