From bf34b3c86ffdc42bd5fa9ecb36e57391459f5572 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Tue, 4 Nov 2025 11:03:18 +0100 Subject: [PATCH] domain_capabilities: Use virXMLFormatElement() in FORMAT_PROLOGUE and FORMAT_EPILOGUE macros Domain capabilities XML is formatted (mostly) using FORMAT_PROLOGUE and FORMAT_EPILOGUE macros. These format opening and closing stanzas for given element. The FORMAT_PROLOGUE macro even tries to be clever and format element onto one line (if the element isn't supported), but that's not enough. Fortunately, we have virXMLFormatElement() which formats elements properly, so let's switch macros into using that. Signed-off-by: Michal Privoznik Reviewed-by: Peter Krempa --- src/conf/domain_capabilities.c | 37 +++++++++++++-------- tests/domaincapsdata/bhyve_basic.x86_64.xml | 3 +- tests/domaincapsdata/bhyve_fbuf.x86_64.xml | 3 +- tests/domaincapsdata/bhyve_uefi.x86_64.xml | 3 +- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index 78a5b1f56a..f843124695 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -373,27 +373,38 @@ virDomainCapsStringValuesFormat(virBuffer *buf, } +/** + * FORMAT_PROLOGUE: + * @item: item to format + * + * Formats part of domain capabilities for @item. The element name is #item so + * variable name is important. If the particular capability is not supported, + * then the macro also returns early. + * + * Additionally, the macro declares two variables: @childBuf and @attrBuf where + * the former holds contents of the child elements and the latter holds + * contents of <#item/> attributes (so far limited to "supported='yes/no'"). + */ #define FORMAT_PROLOGUE(item) \ + g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); \ + g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; \ do { \ if (!item || item->supported == VIR_TRISTATE_BOOL_ABSENT) \ return; \ - virBufferAsprintf(buf, "<" #item " supported='%s'%s\n", \ - (item->supported == VIR_TRISTATE_BOOL_YES) ? "yes" : "no", \ - (item->supported == VIR_TRISTATE_BOOL_YES) ? ">" : "/>"); \ - if (item->supported == VIR_TRISTATE_BOOL_NO) \ + virBufferAsprintf(&attrBuf, " supported='%s'", \ + (item->supported == VIR_TRISTATE_BOOL_YES) ? "yes" : "no"); \ + if (item->supported == VIR_TRISTATE_BOOL_NO) { \ + virXMLFormatElement(buf, #item, &attrBuf, NULL); \ return; \ - virBufferAdjustIndent(buf, 2); \ + } \ } while (0) #define FORMAT_EPILOGUE(item) \ - do { \ - virBufferAdjustIndent(buf, -2); \ - virBufferAddLit(buf, "\n"); \ - } while (0) + virXMLFormatElement(buf, #item, &attrBuf, &childBuf) #define ENUM_PROCESS(master, capsEnum, valToStr) \ do { \ - virDomainCapsEnumFormat(buf, &master->capsEnum, \ + virDomainCapsEnumFormat(&childBuf, &master->capsEnum, \ #capsEnum, valToStr); \ } while (0) @@ -417,7 +428,7 @@ virDomainCapsLoaderFormat(virBuffer *buf, { FORMAT_PROLOGUE(loader); - virDomainCapsStringValuesFormat(buf, &loader->values); + virDomainCapsStringValuesFormat(&childBuf, &loader->values); ENUM_PROCESS(loader, type, virDomainLoaderTypeToString); ENUM_PROCESS(loader, readonly, virTristateBoolTypeToString); ENUM_PROCESS(loader, secure, virTristateBoolTypeToString); @@ -435,7 +446,7 @@ virDomainCapsOSFormat(virBuffer *buf, ENUM_PROCESS(os, firmware, virDomainOsDefFirmwareTypeToString); - virDomainCapsLoaderFormat(buf, loader); + virDomainCapsLoaderFormat(&childBuf, loader); FORMAT_EPILOGUE(os); } @@ -851,7 +862,7 @@ virDomainCapsFeatureHypervFormat(virBuffer *buf, virBufferEscapeString(&defaults, "%s\n", hyperv->vendor_id); } - virXMLFormatElement(buf, "defaults", NULL, &defaults); + virXMLFormatElement(&childBuf, "defaults", NULL, &defaults); FORMAT_EPILOGUE(hyperv); } diff --git a/tests/domaincapsdata/bhyve_basic.x86_64.xml b/tests/domaincapsdata/bhyve_basic.x86_64.xml index 2dee7c6547..44527bbb7f 100644 --- a/tests/domaincapsdata/bhyve_basic.x86_64.xml +++ b/tests/domaincapsdata/bhyve_basic.x86_64.xml @@ -26,8 +26,7 @@ - - + tcp diff --git a/tests/domaincapsdata/bhyve_uefi.x86_64.xml b/tests/domaincapsdata/bhyve_uefi.x86_64.xml index b093358c49..d99dde98e1 100644 --- a/tests/domaincapsdata/bhyve_uefi.x86_64.xml +++ b/tests/domaincapsdata/bhyve_uefi.x86_64.xml @@ -35,8 +35,7 @@