int default_snapshot,
bool require_match);
-# define VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA \
- (VIR_DOMAIN_SNAPSHOT_LIST_METADATA | \
- VIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA)
-
-# define VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES \
- (VIR_DOMAIN_SNAPSHOT_LIST_LEAVES | \
- VIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES)
-
-# define VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS \
- (VIR_DOMAIN_SNAPSHOT_LIST_INACTIVE | \
- VIR_DOMAIN_SNAPSHOT_LIST_ACTIVE | \
- VIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY)
-
-# define VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION \
- (VIR_DOMAIN_SNAPSHOT_LIST_INTERNAL | \
- VIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL)
-
-# define VIR_DOMAIN_SNAPSHOT_FILTERS_ALL \
- (VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA | \
- VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES | \
- VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS | \
- VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION)
-
bool virDomainSnapshotDefIsExternal(virDomainSnapshotDefPtr def);
bool virDomainSnapshotIsExternal(virDomainSnapshotObjPtr snap);
}
/* Snapshot Obj List functions */
+static bool
+virDomainSnapshotFilter(virDomainSnapshotObjPtr obj,
+ unsigned int flags)
+{
+ virDomainSnapshotDefPtr def = virDomainSnapshotObjGetDef(obj);
+
+ /* Caller has already sanitized flags and performed filtering on
+ * DESCENDANTS and LEAVES. */
+ if (flags & VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS) {
+ if (!(flags & VIR_DOMAIN_SNAPSHOT_LIST_INACTIVE) &&
+ def->state == VIR_DOMAIN_SNAPSHOT_SHUTOFF)
+ return false;
+ if (!(flags & VIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY) &&
+ def->state == VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT)
+ return false;
+ if (!(flags & VIR_DOMAIN_SNAPSHOT_LIST_ACTIVE) &&
+ def->state != VIR_DOMAIN_SNAPSHOT_SHUTOFF &&
+ def->state != VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT)
+ return false;
+ }
+
+ if ((flags & VIR_DOMAIN_SNAPSHOT_LIST_INTERNAL) &&
+ virDomainSnapshotIsExternal(obj))
+ return false;
+ if ((flags & VIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL) &&
+ !virDomainSnapshotIsExternal(obj))
+ return false;
+
+ return true;
+}
+
+
static void
virDomainSnapshotObjListDataFree(void *payload,
const void *name ATTRIBUTE_UNUSED)
VIR_FREE(snapshots);
}
+
struct virDomainSnapshotNameData {
char **const names;
int maxnames;
unsigned int flags;
int count;
bool error;
+ virDomainSnapshotObjListFilter filter;
};
static int virDomainSnapshotObjListCopyNames(void *payload,
if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES) && !obj->nchildren)
return 0;
- if (data->flags & VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS) {
- virDomainSnapshotDefPtr def = virDomainSnapshotObjGetDef(obj);
-
- if (!(data->flags & VIR_DOMAIN_SNAPSHOT_LIST_INACTIVE) &&
- def->state == VIR_DOMAIN_SNAPSHOT_SHUTOFF)
- return 0;
- if (!(data->flags & VIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY) &&
- def->state == VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT)
- return 0;
- if (!(data->flags & VIR_DOMAIN_SNAPSHOT_LIST_ACTIVE) &&
- def->state != VIR_DOMAIN_SNAPSHOT_SHUTOFF &&
- def->state != VIR_DOMAIN_SNAPSHOT_DISK_SNAPSHOT)
- return 0;
- }
-
- if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_INTERNAL) &&
- virDomainSnapshotIsExternal(obj))
- return 0;
- if ((data->flags & VIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL) &&
- !virDomainSnapshotIsExternal(obj))
+ if (data->filter(obj, data->flags))
return 0;
if (data->names && data->count < data->maxnames &&
int
virDomainSnapshotObjListGetNames(virDomainSnapshotObjListPtr snapshots,
virDomainSnapshotObjPtr from,
- char **const names, int maxnames,
+ char **const names,
+ int maxnames,
unsigned int flags)
{
struct virDomainSnapshotNameData data = { names, maxnames, flags, 0,
- false };
+ false, virDomainSnapshotFilter };
size_t i;
if (!from) {
# include "virdomainsnapshotobj.h"
# include "virbuffer.h"
+/* Filter that returns true if a given snapshot matches the filter flags */
+typedef bool (*virDomainSnapshotObjListFilter)(virDomainSnapshotObjPtr obj,
+ unsigned int flags);
+
virDomainSnapshotObjListPtr virDomainSnapshotObjListNew(void);
void virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots);
void *data);
int virDomainSnapshotUpdateRelations(virDomainSnapshotObjListPtr snapshots);
+# define VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA \
+ (VIR_DOMAIN_SNAPSHOT_LIST_METADATA | \
+ VIR_DOMAIN_SNAPSHOT_LIST_NO_METADATA)
+
+# define VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES \
+ (VIR_DOMAIN_SNAPSHOT_LIST_LEAVES | \
+ VIR_DOMAIN_SNAPSHOT_LIST_NO_LEAVES)
+
+# define VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS \
+ (VIR_DOMAIN_SNAPSHOT_LIST_INACTIVE | \
+ VIR_DOMAIN_SNAPSHOT_LIST_ACTIVE | \
+ VIR_DOMAIN_SNAPSHOT_LIST_DISK_ONLY)
+
+# define VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION \
+ (VIR_DOMAIN_SNAPSHOT_LIST_INTERNAL | \
+ VIR_DOMAIN_SNAPSHOT_LIST_EXTERNAL)
+
+# define VIR_DOMAIN_SNAPSHOT_FILTERS_ALL \
+ (VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA | \
+ VIR_DOMAIN_SNAPSHOT_FILTERS_LEAVES | \
+ VIR_DOMAIN_SNAPSHOT_FILTERS_STATUS | \
+ VIR_DOMAIN_SNAPSHOT_FILTERS_LOCATION)
+
int virDomainListSnapshots(virDomainSnapshotObjListPtr snapshots,
virDomainSnapshotObjPtr from,
virDomainPtr dom,