]> xenbits.xensource.com Git - libvirt.git/commitdiff
snapshot: Add virDomainSnapshotObjListFormat
authorEric Blake <eblake@redhat.com>
Sun, 17 Feb 2019 02:13:44 +0000 (20:13 -0600)
committerEric Blake <eblake@redhat.com>
Thu, 7 Mar 2019 23:31:40 +0000 (17:31 -0600)
Add a new function to output all of the domain's snapshots in one
buffer.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/conf/snapshot_conf.c
src/conf/snapshot_conf.h
src/libvirt_private.syms

index 92b694c4b3b291280e84f21282254a496b766cc6..ee511930672127c017d5561135d7e43b4674ad8d 100644 (file)
@@ -809,6 +809,67 @@ virDomainSnapshotDefFormat(const char *uuidstr,
     return virBufferContentAndReset(&buf);
 }
 
+
+/* Struct and callback function used as a hash table callback; each call
+ * appends another snapshot XML to buf, with the caller clearing the
+ * buffer if any callback fails. */
+struct virDomainSnapshotFormatData {
+    virBufferPtr buf;
+    const char *uuidstr;
+    virCapsPtr caps;
+    virDomainXMLOptionPtr xmlopt;
+    unsigned int flags;
+};
+
+static int
+virDomainSnapshotFormatOne(void *payload,
+                           const void *name ATTRIBUTE_UNUSED,
+                           void *opaque)
+{
+    virDomainSnapshotObjPtr snap = payload;
+    struct virDomainSnapshotFormatData *data = opaque;
+    return virDomainSnapshotDefFormatInternal(data->buf, data->uuidstr,
+                                              snap->def, data->caps,
+                                              data->xmlopt, data->flags);
+}
+
+
+/* Format the XML for all snapshots in the list into buf. On error,
+ * clear the buffer and return -1. */
+int
+virDomainSnapshotObjListFormat(virBufferPtr buf,
+                               const char *uuidstr,
+                               virDomainSnapshotObjListPtr snapshots,
+                               virDomainSnapshotObjPtr current_snapshot,
+                               virCapsPtr caps,
+                               virDomainXMLOptionPtr xmlopt,
+                               unsigned int flags)
+{
+    struct virDomainSnapshotFormatData data = {
+        .buf = buf,
+        .uuidstr = uuidstr,
+        .caps = caps,
+        .xmlopt = xmlopt,
+        .flags = flags,
+    };
+
+    virBufferAddLit(buf, "<snapshots");
+    if (current_snapshot)
+        virBufferEscapeString(buf, " current='%s'",
+                              current_snapshot->def->name);
+    virBufferAddLit(buf, ">\n");
+    virBufferAdjustIndent(buf, 2);
+    if (virDomainSnapshotForEach(snapshots, virDomainSnapshotFormatOne,
+                                 &data) < 0) {
+        virBufferFreeAndReset(buf);
+        return -1;
+    }
+    virBufferAdjustIndent(buf, -2);
+    virBufferAddLit(buf, "</snapshots>\n");
+    return 0;
+}
+
+
 /* Snapshot Obj functions */
 static virDomainSnapshotObjPtr virDomainSnapshotObjNew(void)
 {
index 3577f7654382363283711e18f2b1a4a08c64fb10..d27ba3d0b6a2e85d8ad6def29c06090741bf469e 100644 (file)
@@ -138,6 +138,13 @@ char *virDomainSnapshotDefFormat(const char *uuidstr,
                                  virCapsPtr caps,
                                  virDomainXMLOptionPtr xmlopt,
                                  unsigned int flags);
+int virDomainSnapshotObjListFormat(virBufferPtr buf,
+                                   const char *uuidstr,
+                                   virDomainSnapshotObjListPtr snapshots,
+                                   virDomainSnapshotObjPtr current_snapshot,
+                                   virCapsPtr caps,
+                                   virDomainXMLOptionPtr xmlopt,
+                                   unsigned int flags);
 int virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr snapshot,
                                 int default_snapshot,
                                 bool require_match);
index b5d65c99c995f5b24971e68dc9ab9574eea7c7a1..339e52b1720ced1385193823a8c70cffb6f2d503 100644 (file)
@@ -895,6 +895,7 @@ virDomainSnapshotFormatConvertXMLFlags;
 virDomainSnapshotIsExternal;
 virDomainSnapshotLocationTypeFromString;
 virDomainSnapshotLocationTypeToString;
+virDomainSnapshotObjListFormat;
 virDomainSnapshotObjListFree;
 virDomainSnapshotObjListGetNames;
 virDomainSnapshotObjListNew;