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.