snapshot: Add virDomainSnapshotObjListFormat

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>
This commit is contained in:
Eric Blake 2019-02-16 20:13:44 -06:00
parent cae6619ad5
commit 86c0ed6f70
3 changed files with 69 additions and 0 deletions

View 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)
{

View 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);

View File

@ -895,6 +895,7 @@ virDomainSnapshotFormatConvertXMLFlags;
virDomainSnapshotIsExternal;
virDomainSnapshotLocationTypeFromString;
virDomainSnapshotLocationTypeToString;
virDomainSnapshotObjListFormat;
virDomainSnapshotObjListFree;
virDomainSnapshotObjListGetNames;
virDomainSnapshotObjListNew;