]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
domain_capabilities: Use virXMLFormatElement() in FORMAT_PROLOGUE and FORMAT_EPILOGUE...
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 4 Nov 2025 10:03:18 +0000 (11:03 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 10 Nov 2025 11:21:48 +0000 (12:21 +0100)
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 <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/conf/domain_capabilities.c
tests/domaincapsdata/bhyve_basic.x86_64.xml
tests/domaincapsdata/bhyve_fbuf.x86_64.xml
tests/domaincapsdata/bhyve_uefi.x86_64.xml

index 78a5b1f56ada9dab286bd4f0d4e648fdd78b442b..f8431246951abcb4597a2f681531d09433a08793 100644 (file)
@@ -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, "</" #item ">\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, "<vendor_id>%s</vendor_id>\n", hyperv->vendor_id);
     }
 
-    virXMLFormatElement(buf, "defaults", NULL, &defaults);
+    virXMLFormatElement(&childBuf, "defaults", NULL, &defaults);
 
     FORMAT_EPILOGUE(hyperv);
 }
index 2dee7c6547815907e76809f08a7936be5a233682..44527bbb7f8aff44664e38eb6a000c2dc4a99d86 100644 (file)
@@ -26,8 +26,7 @@
     </disk>
     <graphics supported='no'/>
     <video supported='no'/>
-    <hostdev supported='yes'>
-    </hostdev>
+    <hostdev supported='yes'/>
     <console supported='yes'>
       <enum name='type'>
         <value>tcp</value>
index d2f0dd6383237d688f4e33aed74530d75e44c648..5b2044736cb6f91839b426c9e50ab24a247b56d1 100644 (file)
@@ -43,8 +43,7 @@
         <value>gop</value>
       </enum>
     </video>
-    <hostdev supported='yes'>
-    </hostdev>
+    <hostdev supported='yes'/>
     <console supported='yes'>
       <enum name='type'>
         <value>tcp</value>
index b093358c49f331f552a40bf0753e771acc2e6b20..d99dde98e1279521d49b4e5f7a83d938fbf7787e 100644 (file)
@@ -35,8 +35,7 @@
     </disk>
     <graphics supported='no'/>
     <video supported='no'/>
-    <hostdev supported='yes'>
-    </hostdev>
+    <hostdev supported='yes'/>
     <console supported='yes'>
       <enum name='type'>
         <value>tcp</value>