]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
list: use the new snapshot API in virsh when possible
authorEric Blake <eblake@redhat.com>
Fri, 8 Jun 2012 22:00:43 +0000 (16:00 -0600)
committerEric Blake <eblake@redhat.com>
Tue, 19 Jun 2012 19:50:03 +0000 (13:50 -0600)
Using the new API is so much shorter than the rest of the remainder
of the function.

* tools/virsh.c (vshSnapshotList): Use the new API.

tools/virsh.c

index 045decd7e81a27c1081ad23a9b4cd7ac013d5428..a117424b1a6345108e74e25a28d9ec7dc9e0834d 100644 (file)
@@ -16786,13 +16786,42 @@ vshSnapshotListCollect(vshControl *ctl, virDomainPtr dom,
     int count = -1;
     bool descendants = false;
     bool roots = false;
+    virDomainSnapshotPtr *snaps;
     vshSnapshotListPtr snaplist = vshMalloc(ctl, sizeof(*snaplist));
     vshSnapshotListPtr ret = NULL;
     const char *fromname = NULL;
     int start_index = -1;
     int deleted = 0;
 
-    /* 0.9.13 will be adding a new listing API.  */
+    /* Try the interface available in 0.9.13 and newer.  */
+    if (!ctl->useSnapshotOld) {
+        if (from)
+            count = virDomainSnapshotListAllChildren(from, &snaps, flags);
+        else
+            count = virDomainListAllSnapshots(dom, &snaps, flags);
+    }
+    if (count >= 0) {
+        /* When mixing --from and --tree, we also want a copy of from
+         * in the list, but with no parent for that one entry.  */
+        snaplist->snaps = vshCalloc(ctl, sizeof(*snaplist->snaps),
+                                    count + (tree && from));
+        snaplist->nsnaps = count;
+        for (i = 0; i < count; i++)
+            snaplist->snaps[i].snap = snaps[i];
+        VIR_FREE(snaps);
+        if (tree) {
+            for (i = 0; i < count; i++) {
+                if (vshGetSnapshotParent(ctl, snaplist->snaps[i].snap,
+                                         &snaplist->snaps[i].parent) < 0)
+                    goto cleanup;
+            }
+            if (from) {
+                snaps[snaplist->nsnaps++] = from;
+                virDomainSnapshotRef(from);
+            }
+        }
+        goto success;
+    }
 
     /* Assume that if we got this far, then the --no-leaves and
      * --no-metadata flags were not supported.  Disable groups that