Refactor the formatter to the new multiple buffer based approach so that
we can easily separate it into formatters per subsys type.
Signed-off-by: Peter Krempa
---
src/conf/domain_conf.c | 65 ++
1 file changed, 27 insertions(+), 38 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 8f5a8ef4a4..4b1f27fcea 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -26030,7 +26030,9 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
bool includeTypeInAddr,
virDomainXMLOptionPtr xmlopt)
{
-bool closedSource = false;
+g_auto(virBuffer) sourceAttrBuf = VIR_BUFFER_INITIALIZER;
+g_auto(virBuffer) sourceChildBuf = VIR_BUFFER_INIT_CHILD(buf);
+g_auto(virBuffer) origstatesChildBuf =
VIR_BUFFER_INIT_CHILD(&sourceChildBuf);
virDomainHostdevSubsysUSBPtr usbsrc = &def->source.subsys.u.usb;
virDomainHostdevSubsysPCIPtr pcisrc = &def->source.subsys.u.pci;
virDomainHostdevSubsysSCSIPtr scsisrc = &def->source.subsys.u.scsi;
@@ -26053,18 +26055,17 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
virBufferAsprintf(buf, "\n", backend);
}
-virBufferAddLit(buf, "source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
if (def->startupPolicy) {
const char *policy;
policy = virDomainStartupPolicyTypeToString(def->startupPolicy);
-virBufferAsprintf(buf, " startupPolicy='%s'", policy);
+virBufferAsprintf(&sourceAttrBuf, " startupPolicy='%s'", policy);
}
if (usbsrc->autoAddress && (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE))
-virBufferAddLit(buf, " autoAddress='yes'");
+virBufferAddLit(&sourceAttrBuf, " autoAddress='yes'");
if (def->missing && !(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE))
-virBufferAddLit(buf, " missing='yes'");
+virBufferAddLit(&sourceAttrBuf, " missing='yes'");
}
if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
@@ -26072,69 +26073,59 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf,
const char *protocol =
virDomainHostdevSubsysSCSIProtocolTypeToString(scsisrc->protocol);
-virBufferAsprintf(buf, " protocol='%s' name='%s'",
+virBufferAsprintf(&sourceAttrBuf, " protocol='%s' name='%s'",
protocol, iscsisrc->src->path);
}
if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST) {
const char *protocol =
virDomainHostdevSubsysSCSIHostProtocolTypeToString(hostsrc->protocol);
-closedSource = true;
-virBufferAsprintf(buf, " protocol='%s' wwpn='%s'/",
+virBufferAsprintf(&sourceAttrBuf, " protocol='%s' wwpn='%s'",
protocol, hostsrc->wwpn);
}
-virBufferAddLit(buf, ">\n");
-
-virBufferAdjustIndent(buf, 2);
switch (def->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
if (usbsrc->vendor) {
-virBufferAsprintf(buf, "\n", usbsrc->vendor);
-virBufferAsprintf(buf, "\n",
usbsrc->product);
+virBufferAsprintf(&sourceChildBuf, "\n",
usbsrc->vendor);
+virBufferAsprintf(&sourceChildBuf, "\n",
usbsrc->product);
}
if (usbsrc->bus || usbsrc->device) {
-virBufferAsprintf(buf, "\n",
+virBufferAsprintf(&sourceChildBuf, "\n",
includeTypeInAddr ? "type='usb' " : "",
usbsrc->bus, usbsrc->device);
}
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
-virPCIDeviceAddressFormat(buf, pcisrc->addr,
+virPCIDeviceAddressFormat(&sourceChildBuf, pcisrc->addr,
includeTypeInAddr);
-if ((flags & VIR_DOMAIN_DEF_FORMAT_PCI_ORIG_STATES) &&
-(def->origstates.states.pci.unbind_from_stub ||
- def->origstates.states.pci.remove_slot ||
- def->origstates.states.pci.reprobe)) {
-virBufferAddLit(buf, "\n");
-virBufferAdjustIndent(buf, 2);
+if ((flags & VIR_DOMAIN_DEF_FORMAT_PCI_ORIG_STATES)) {
if (def->origstates.states.pci.unbind_from_stub)
-virBufferAddLit(buf, "\n");
+virBufferAddLit(&origstatesChildBuf, "\n");
if (def->origstates.states.pci.remove_slot)
-virBufferAddLit(buf, "\n");
+virBufferAddLit(&origstatesChildBuf, "\n");
if (def->origstates.states.pci.reprobe)
-virBufferAddLit(buf, "\n");
-virBufferAdjustIndent(buf, -2);
-virBufferAddLit(buf, "\n");
+virBufferAddLit(&origstatesChildBuf, "\n");
+virXMLFormatElement(&sourceChildBuf, "origstates", NULL,
&origstatesChildBuf);
}
break;
case VIR_DOMAIN