[libvirt] [PATCHv2 09/13] list: use the new snapshot API in virsh when possible

Eric Blake eblake at redhat.com
Fri Jun 15 04:18:34 UTC 2012


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.
---

v2: fixes needed to pass testing

 tools/virsh.c |   31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 3e1018e..13b1c01 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -17002,13 +17002,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
-- 
1.7.10.2




More information about the libvir-list mailing list