Let's extract out the <host> code into it's own method/helper. NB: One minor change between the two is usage of "buf" instead of "&buf" in the new code since we pass the address of &buf to the helper. Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> --- src/conf/capabilities.c | 135 ++++++++++++++++++++++------------------ 1 file changed, 76 insertions(+), 59 deletions(-) diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 8e9bba0dbe..33c0c37fbf 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -1056,130 +1056,147 @@ virCapabilitiesFormatMemoryBandwidth(virBufferPtr buf, return 0; } -/** - * virCapabilitiesFormatXML: - * @caps: capabilities to format - * - * Convert the capabilities object into an XML representation - * - * Returns the XML document as a string - */ -char * -virCapabilitiesFormatXML(virCapsPtr caps) + +static int +virCapabilitiesFormatHostXML(virCapsPtr caps, + virBufferPtr buf) { - virBuffer buf = VIR_BUFFER_INITIALIZER; - size_t i, j, k; + size_t i, j; char host_uuid[VIR_UUID_STRING_BUFLEN]; - virBufferAddLit(&buf, "<capabilities>\n\n"); - virBufferAdjustIndent(&buf, 2); - virBufferAddLit(&buf, "<host>\n"); - virBufferAdjustIndent(&buf, 2); + virBufferAddLit(buf, "<host>\n"); + virBufferAdjustIndent(buf, 2); if (virUUIDIsValid(caps->host.host_uuid)) { virUUIDFormat(caps->host.host_uuid, host_uuid); - virBufferAsprintf(&buf, "<uuid>%s</uuid>\n", host_uuid); + virBufferAsprintf(buf, "<uuid>%s</uuid>\n", host_uuid); } - virBufferAddLit(&buf, "<cpu>\n"); - virBufferAdjustIndent(&buf, 2); + virBufferAddLit(buf, "<cpu>\n"); + virBufferAdjustIndent(buf, 2); if (caps->host.arch) - virBufferAsprintf(&buf, "<arch>%s</arch>\n", + virBufferAsprintf(buf, "<arch>%s</arch>\n", virArchToString(caps->host.arch)); if (caps->host.nfeatures) { - virBufferAddLit(&buf, "<features>\n"); - virBufferAdjustIndent(&buf, 2); + virBufferAddLit(buf, "<features>\n"); + virBufferAdjustIndent(buf, 2); for (i = 0; i < caps->host.nfeatures; i++) { - virBufferAsprintf(&buf, "<%s/>\n", + virBufferAsprintf(buf, "<%s/>\n", caps->host.features[i]); } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "</features>\n"); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</features>\n"); } - virCPUDefFormatBuf(&buf, caps->host.cpu); + virCPUDefFormatBuf(buf, caps->host.cpu); for (i = 0; i < caps->host.nPagesSize; i++) { - virBufferAsprintf(&buf, "<pages unit='KiB' size='%u'/>\n", + virBufferAsprintf(buf, "<pages unit='KiB' size='%u'/>\n", caps->host.pagesSize[i]); } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "</cpu>\n"); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</cpu>\n"); /* The PM query was successful. */ if (caps->host.powerMgmt) { /* The host supports some PM features. */ unsigned int pm = caps->host.powerMgmt; - virBufferAddLit(&buf, "<power_management>\n"); - virBufferAdjustIndent(&buf, 2); + virBufferAddLit(buf, "<power_management>\n"); + virBufferAdjustIndent(buf, 2); while (pm) { int bit = ffs(pm) - 1; - virBufferAsprintf(&buf, "<%s/>\n", + virBufferAsprintf(buf, "<%s/>\n", virCapsHostPMTargetTypeToString(bit)); pm &= ~(1U << bit); } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "</power_management>\n"); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</power_management>\n"); } else { /* The host does not support any PM feature. */ - virBufferAddLit(&buf, "<power_management/>\n"); + virBufferAddLit(buf, "<power_management/>\n"); } - virBufferAsprintf(&buf, "<iommu support='%s'/>\n", + virBufferAsprintf(buf, "<iommu support='%s'/>\n", caps->host.iommu ? "yes" : "no"); if (caps->host.offlineMigrate) { - virBufferAddLit(&buf, "<migration_features>\n"); - virBufferAdjustIndent(&buf, 2); + virBufferAddLit(buf, "<migration_features>\n"); + virBufferAdjustIndent(buf, 2); if (caps->host.liveMigrate) - virBufferAddLit(&buf, "<live/>\n"); + virBufferAddLit(buf, "<live/>\n"); if (caps->host.nmigrateTrans) { - virBufferAddLit(&buf, "<uri_transports>\n"); - virBufferAdjustIndent(&buf, 2); + virBufferAddLit(buf, "<uri_transports>\n"); + virBufferAdjustIndent(buf, 2); for (i = 0; i < caps->host.nmigrateTrans; i++) { - virBufferAsprintf(&buf, "<uri_transport>%s</uri_transport>\n", + virBufferAsprintf(buf, "<uri_transport>%s</uri_transport>\n", caps->host.migrateTrans[i]); } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "</uri_transports>\n"); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</uri_transports>\n"); } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "</migration_features>\n"); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</migration_features>\n"); } if (caps->host.netprefix) - virBufferAsprintf(&buf, "<netprefix>%s</netprefix>\n", + virBufferAsprintf(buf, "<netprefix>%s</netprefix>\n", caps->host.netprefix); if (caps->host.nnumaCell && - virCapabilitiesFormatNUMATopology(&buf, caps->host.nnumaCell, + virCapabilitiesFormatNUMATopology(buf, caps->host.nnumaCell, caps->host.numaCell) < 0) goto error; - if (virCapabilitiesFormatCaches(&buf, &caps->host.cache) < 0) + if (virCapabilitiesFormatCaches(buf, &caps->host.cache) < 0) goto error; - if (virCapabilitiesFormatMemoryBandwidth(&buf, &caps->host.memBW) < 0) + if (virCapabilitiesFormatMemoryBandwidth(buf, &caps->host.memBW) < 0) goto error; for (i = 0; i < caps->host.nsecModels; i++) { - virBufferAddLit(&buf, "<secmodel>\n"); - virBufferAdjustIndent(&buf, 2); - virBufferAsprintf(&buf, "<model>%s</model>\n", + virBufferAddLit(buf, "<secmodel>\n"); + virBufferAdjustIndent(buf, 2); + virBufferAsprintf(buf, "<model>%s</model>\n", caps->host.secModels[i].model); - virBufferAsprintf(&buf, "<doi>%s</doi>\n", + virBufferAsprintf(buf, "<doi>%s</doi>\n", caps->host.secModels[i].doi); for (j = 0; j < caps->host.secModels[i].nlabels; j++) { - virBufferAsprintf(&buf, "<baselabel type='%s'>%s</baselabel>\n", + virBufferAsprintf(buf, "<baselabel type='%s'>%s</baselabel>\n", caps->host.secModels[i].labels[j].type, caps->host.secModels[i].labels[j].label); } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "</secmodel>\n"); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</secmodel>\n"); } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "</host>\n\n"); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</host>\n\n"); + + return 0; + + error: + return -1; +} + + +/** + * virCapabilitiesFormatXML: + * @caps: capabilities to format + * + * Convert the capabilities object into an XML representation + * + * Returns the XML document as a string + */ +char * +virCapabilitiesFormatXML(virCapsPtr caps) +{ + virBuffer buf = VIR_BUFFER_INITIALIZER; + size_t i, j, k; + virBufferAddLit(&buf, "<capabilities>\n\n"); + virBufferAdjustIndent(&buf, 2); + + if (virCapabilitiesFormatHostXML(caps, &buf) < 0) + goto error; for (i = 0; i < caps->nguests; i++) { virBufferAddLit(&buf, "<guest>\n"); -- 2.20.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list