]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add APIs for issuing 'memsave' and 'pmemsave' monitor commands
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 23 Sep 2009 12:33:45 +0000 (13:33 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 29 Sep 2009 10:54:25 +0000 (11:54 +0100)
* src/qemu/qemu_monitor.h, src/qemu/qemu_monitor.c: Add new APIs
  qemuMonitorSaveVirtualMemory() and qemuMonitorSavePhysicalMemory()
* src/qemu/qemu_driver.c: Use the new qemuMonitorSaveVirtualMemory()
  and qemuMonitorSavePhysicalMemory() APIs

src/qemu/qemu_driver.c
src/qemu/qemu_monitor_text.c
src/qemu/qemu_monitor_text.h

index ce06f658e35b7c22a87c257627c75a360146a85b..545cecf3ae977ebef2e62c22321926f50c946262 100644 (file)
@@ -6232,7 +6232,6 @@ qemudDomainMemoryPeek (virDomainPtr dom,
 {
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
-    char cmd[256], *info = NULL;
     char *tmp = NULL;
     int fd = -1, ret = -1;
 
@@ -6272,21 +6271,14 @@ qemudDomainMemoryPeek (virDomainPtr dom,
         goto cleanup;
     }
 
-    if (flags == VIR_MEMORY_VIRTUAL)
-        /* Issue the memsave command. */
-        snprintf (cmd, sizeof cmd, "memsave %llu %zi \"%s\"", offset, size, tmp);
-    else
-        /* Issue the pmemsave command. */
-        snprintf (cmd, sizeof cmd, "pmemsave %llu %zi \"%s\"", offset, size, tmp);
-
-    if (qemudMonitorCommand (vm, cmd, &info) < 0) {
-        qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                          "%s", _("'memsave' command failed"));
-        goto cleanup;
+    if (flags == VIR_MEMORY_VIRTUAL) {
+        if (qemuMonitorSaveVirtualMemory(vm, offset, size, tmp) < 0)
+            goto cleanup;
+    } else {
+        if (qemuMonitorSavePhysicalMemory(vm, offset, size, tmp) < 0)
+            goto cleanup;
     }
 
-    DEBUG ("%s: (p)memsave reply: %s", vm->def->name, info);
-
     /* Read the memory file into buffer. */
     if (saferead (fd, buffer, size) == (ssize_t) -1) {
         virReportSystemError (dom->conn, errno,
@@ -6299,7 +6291,6 @@ qemudDomainMemoryPeek (virDomainPtr dom,
 
 cleanup:
     VIR_FREE(tmp);
-    VIR_FREE(info);
     if (fd >= 0) close (fd);
     unlink (tmp);
     if (vm)
index 43bca4c11ac5759747ca69e9d9d50f422c88cba1..93e0d404700c35def1ceda4b67b727b380ab5052 100644 (file)
@@ -810,3 +810,57 @@ cleanup:
     return ret;
 }
 
+static int qemuMonitorSaveMemory(const virDomainObjPtr vm,
+                                 const char *cmdtype,
+                                 unsigned long long offset,
+                                 size_t length,
+                                 const char *path)
+{
+    char *cmd = NULL;
+    char *reply = NULL;
+    char *safepath = NULL;
+    int ret = -1;
+
+    if (!(safepath = qemudEscapeMonitorArg(path))) {
+        virReportOOMError(NULL);
+        goto cleanup;
+    }
+
+    if (virAsprintf(&cmd, "%s %llu %zi \"%s\"", cmdtype, offset, length, safepath) < 0) {
+        virReportOOMError(NULL);
+        goto cleanup;
+    }
+
+    if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
+        qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+                         _("could save memory region to '%s'"), path);
+        goto cleanup;
+    }
+
+    /* XXX what is printed on failure ? */
+
+    ret = 0;
+
+cleanup:
+    VIR_FREE(cmd);
+    VIR_FREE(reply);
+    VIR_FREE(safepath);
+    return ret;
+}
+
+
+int qemuMonitorSaveVirtualMemory(const virDomainObjPtr vm,
+                                 unsigned long long offset,
+                                 size_t length,
+                                 const char *path)
+{
+    return qemuMonitorSaveMemory(vm, "memsave", offset, length, path);
+}
+
+int qemuMonitorSavePhysicalMemory(const virDomainObjPtr vm,
+                                  unsigned long long offset,
+                                  size_t length,
+                                  const char *path)
+{
+    return qemuMonitorSaveMemory(vm, "pmemsave", offset, length, path);
+}
index cd9354a19b1128cf01eb2e2911dd5f8b1370e6d6..fedc101fd9603fa04cdf295c697ea5f092dd2f8b 100644 (file)
@@ -91,4 +91,14 @@ int qemuMonitorChangeMedia(const virDomainObjPtr vm,
                            const char *devname,
                            const char *newmedia);
 
+
+int qemuMonitorSaveVirtualMemory(const virDomainObjPtr vm,
+                                 unsigned long long offset,
+                                 size_t length,
+                                 const char *path);
+int qemuMonitorSavePhysicalMemory(const virDomainObjPtr vm,
+                                  unsigned long long offset,
+                                  size_t length,
+                                  const char *path);
+
 #endif /* QEMU_MONITOR_TEXT_H */