diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index 9f97a9efac..92b694c4b3 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -703,6 +703,94 @@ virDomainSnapshotDiskDefFormat(virBufferPtr buf, } +/* Append XML describing def into buf. Return 0 on success, or -1 on + * failure with buf cleared. */ +static int +virDomainSnapshotDefFormatInternal(virBufferPtr buf, + const char *uuidstr, + virDomainSnapshotDefPtr def, + virCapsPtr caps, + virDomainXMLOptionPtr xmlopt, + unsigned int flags) +{ + size_t i; + int domainflags = VIR_DOMAIN_DEF_FORMAT_INACTIVE; + + if (flags & VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE) + domainflags |= VIR_DOMAIN_DEF_FORMAT_SECURE; + + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + + virBufferEscapeString(buf, "%s\n", def->name); + if (def->description) + virBufferEscapeString(buf, "%s\n", + def->description); + virBufferAsprintf(buf, "%s\n", + virDomainSnapshotStateTypeToString(def->state)); + + if (def->parent) { + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + virBufferEscapeString(buf, "%s\n", def->parent); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } + + virBufferAsprintf(buf, "%lld\n", + def->creationTime); + + if (def->memory) { + virBufferAsprintf(buf, "memory)); + virBufferEscapeString(buf, " file='%s'", def->file); + virBufferAddLit(buf, "/>\n"); + } + + if (def->ndisks) { + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + for (i = 0; i < def->ndisks; i++) { + if (virDomainSnapshotDiskDefFormat(buf, &def->disks[i], xmlopt) < 0) + goto error; + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } + + if (def->dom) { + if (virDomainDefFormatInternal(def->dom, caps, domainflags, buf, + xmlopt) < 0) + goto error; + } else if (uuidstr) { + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + virBufferAsprintf(buf, "%s\n", uuidstr); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } + + if (virSaveCookieFormatBuf(buf, def->cookie, + virDomainXMLOptionGetSaveCookie(xmlopt)) < 0) + goto error; + + if (flags & VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL) + virBufferAsprintf(buf, "%d\n", def->current); + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + + if (virBufferCheckError(buf) < 0) + goto error; + + return 0; + + error: + virBufferFreeAndReset(buf); + return -1; +} + + char * virDomainSnapshotDefFormat(const char *uuidstr, virDomainSnapshotDefPtr def, @@ -711,84 +799,14 @@ virDomainSnapshotDefFormat(const char *uuidstr, unsigned int flags) { virBuffer buf = VIR_BUFFER_INITIALIZER; - size_t i; - int domainflags = VIR_DOMAIN_DEF_FORMAT_INACTIVE; virCheckFlags(VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE | VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL, NULL); - - if (flags & VIR_DOMAIN_SNAPSHOT_FORMAT_SECURE) - domainflags |= VIR_DOMAIN_DEF_FORMAT_SECURE; - - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - - virBufferEscapeString(&buf, "%s\n", def->name); - if (def->description) - virBufferEscapeString(&buf, "%s\n", - def->description); - virBufferAsprintf(&buf, "%s\n", - virDomainSnapshotStateTypeToString(def->state)); - - if (def->parent) { - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - virBufferEscapeString(&buf, "%s\n", def->parent); - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - } - - virBufferAsprintf(&buf, "%lld\n", - def->creationTime); - - if (def->memory) { - virBufferAsprintf(&buf, "memory)); - virBufferEscapeString(&buf, " file='%s'", def->file); - virBufferAddLit(&buf, "/>\n"); - } - - if (def->ndisks) { - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - for (i = 0; i < def->ndisks; i++) { - if (virDomainSnapshotDiskDefFormat(&buf, &def->disks[i], xmlopt) < 0) - goto error; - } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - } - - if (def->dom) { - if (virDomainDefFormatInternal(def->dom, caps, domainflags, &buf, - xmlopt) < 0) - goto error; - } else if (uuidstr) { - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - virBufferAsprintf(&buf, "%s\n", uuidstr); - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - } - - if (virSaveCookieFormatBuf(&buf, def->cookie, - virDomainXMLOptionGetSaveCookie(xmlopt)) < 0) - goto error; - - if (flags & VIR_DOMAIN_SNAPSHOT_FORMAT_INTERNAL) - virBufferAsprintf(&buf, "%d\n", def->current); - - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - - if (virBufferCheckError(&buf) < 0) + if (virDomainSnapshotDefFormatInternal(&buf, uuidstr, def, caps, + xmlopt, flags) < 0) return NULL; return virBufferContentAndReset(&buf); - - error: - virBufferFreeAndReset(&buf); - return NULL; } /* Snapshot Obj functions */