[libvirt] [PATCH] util: improve the sysinfo element XML format

Luyao Huang lhuang at redhat.com
Fri May 22 09:26:28 UTC 2015


When set sysinfo element without sub-elements,
libvirt will format it as:

  <sysinfo type='smbios'>
  </sysinfo>

After improve the format:

  <sysinfo type='smbios'/>

Signed-off-by: Luyao Huang <lhuang at redhat.com>
---
 src/util/virsysinfo.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c
index 8bb17f0..f87376f 100644
--- a/src/util/virsysinfo.c
+++ b/src/util/virsysinfo.c
@@ -1041,31 +1041,42 @@ virSysinfoMemoryFormat(virBufferPtr buf, virSysinfoDefPtr def)
 int
 virSysinfoFormat(virBufferPtr buf, virSysinfoDefPtr def)
 {
+    virBuffer childrenBuf = VIR_BUFFER_INITIALIZER;
     const char *type = virSysinfoTypeToString(def->type);
+    int indent = virBufferGetIndent(buf, false);
+    int ret = -1;
 
     if (!type) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("unexpected sysinfo type model %d"),
                        def->type);
         virBufferFreeAndReset(buf);
-        return -1;
+        goto cleanup;
     }
 
-    virBufferAsprintf(buf, "<sysinfo type='%s'>\n", type);
-    virBufferAdjustIndent(buf, 2);
+    virBufferAdjustIndent(&childrenBuf, indent + 2);
 
-    virSysinfoBIOSFormat(buf, def);
-    virSysinfoSystemFormat(buf, def);
-    virSysinfoProcessorFormat(buf, def);
-    virSysinfoMemoryFormat(buf, def);
+    virSysinfoBIOSFormat(&childrenBuf, def);
+    virSysinfoSystemFormat(&childrenBuf, def);
+    virSysinfoProcessorFormat(&childrenBuf, def);
+    virSysinfoMemoryFormat(&childrenBuf, def);
 
-    virBufferAdjustIndent(buf, -2);
-    virBufferAddLit(buf, "</sysinfo>\n");
+    virBufferAsprintf(buf, "<sysinfo type='%s'", type);
+    if (virBufferUse(&childrenBuf)) {
+        virBufferAddLit(buf, ">\n");
+        virBufferAddBuffer(buf, &childrenBuf);
+        virBufferAddLit(buf, "</sysinfo>\n");
+    } else {
+        virBufferAddLit(buf, "/>\n");
+    }
 
     if (virBufferCheckError(buf) < 0)
-        return -1;
+        goto cleanup;
 
-    return 0;
+    ret = 0;
+ cleanup:
+    virBufferFreeAndReset(&childrenBuf);
+    return ret;
 }
 
 bool virSysinfoIsEqual(virSysinfoDefPtr src,
-- 
1.8.3.1




More information about the libvir-list mailing list