[libvirt] [PATCH 00/23] conf: domain: Buffer and XPath handling refactors

Peter Krempa (23): util: xml: Enforce return value check from virXMLFormatElement conf: Use virXMLFormatElement in virDomainControllerDriverFormat conf: Use virXMLFormatElement in virDomainControllerDefFormat conf: Refactor virDomainMemballoonDefFormat conf: Refactor virDomainWatchdogDefFormat conf: Refactor virDomainPanicDefFormat conf: Refactor formatting of 'driver' in virDomainRNGDefFormat conf: Refactor virDomainInputDefFormat conf: Refactor virDomainHubDefFormat conf: Split out formatting of 'blkiotune' from virDomainDefFormatInternal conf: Split out domain features formatting from virDomainDefFormatInternal conf: Refactor control flow in virDomainDefFormatFeatures conf: Rename temp buffers in virDomainDefFormatFeatures conf: Remove impossible error in virDomainDefFormatFeatures conf: Simplify lifecycle of temp buffers in virDomainDefFormatFeatures conf: Avoid extra set of temp buffers in virDomainDefFormatFeatures conf: Avoid extra scope when formatting 'smm' feature conf: Avoid formatting empty <capabilities> element conf: Refactor formating of 'capabilities' features conf: Use virXMLFormatElement in virDomainDefFormatFeatures conf: domain: Use VIR_AUTOCLEAN(virBuffer) where appropriate conf: Move XPath context node in descendants of virSysinfoParseXML conf: domain: Use VIR_XPATH_NODE_AUTORESTORE where appropriate src/conf/domain_conf.c | 1184 +++++++---------- src/util/virxml.h | 3 +- .../lxcconf2xmldata/lxcconf2xml-blkiotune.xml | 3 +- .../lxcconf2xml-cpusettune.xml | 3 +- tests/lxcconf2xmldata/lxcconf2xml-cputune.xml | 3 +- tests/lxcconf2xmldata/lxcconf2xml-idmap.xml | 3 +- .../lxcconf2xml-macvlannetwork.xml | 3 +- tests/lxcconf2xmldata/lxcconf2xml-memtune.xml | 3 +- .../lxcconf2xml-miscnetwork.xml | 3 +- .../lxcconf2xml-nonenetwork.xml | 3 +- .../lxcconf2xmldata/lxcconf2xml-nonetwork.xml | 3 +- .../lxcconf2xml-physnetwork.xml | 3 +- .../lxcconf2xml-vlannetwork.xml | 3 +- 13 files changed, 485 insertions(+), 735 deletions(-) -- 2.20.1

The function does not transfer errors from 'attrBuf' and 'childBuf' arguments into 'buf', but rather reports them right away, thus we need to make sure that it's always checked.t Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/util/virxml.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/util/virxml.h b/src/util/virxml.h index 78a1e7fa5e..b91fedde82 100644 --- a/src/util/virxml.h +++ b/src/util/virxml.h @@ -217,7 +217,8 @@ int virXMLFormatElement(virBufferPtr buf, const char *name, virBufferPtr attrBuf, - virBufferPtr childBuf); + virBufferPtr childBuf) + ATTRIBUTE_RETURN_CHECK; struct _virXPathContextNodeSave { xmlXPathContextPtr ctxt; -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:26AM +0100, Peter Krempa wrote:
The function does not transfer errors from 'attrBuf' and 'childBuf' arguments into 'buf', but rather reports them right away, thus we need to make sure that it's always checked.t
s/checked.t/checked/
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/util/virxml.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Refactor adding of the controller <driver> element. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index d84cc2d482..e7c71bb43d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -24255,7 +24255,7 @@ virDomainDiskDefFormat(virBufferPtr buf, } -static void +static int virDomainControllerDriverFormat(virBufferPtr buf, virDomainControllerDefPtr def) { @@ -24280,11 +24280,7 @@ virDomainControllerDriverFormat(virBufferPtr buf, virDomainVirtioOptionsFormat(&driverBuf, def->virtio); - if (virBufferError(&driverBuf) != 0 || virBufferUse(&driverBuf)) { - virBufferAddLit(buf, "<driver"); - virBufferAddBuffer(buf, &driverBuf); - virBufferAddLit(buf, "/>\n"); - } + return virXMLFormatElement(buf, "driver", &driverBuf, NULL); } @@ -24417,7 +24413,8 @@ virDomainControllerDefFormat(virBufferPtr buf, } } - virDomainControllerDriverFormat(&childBuf, def); + if (virDomainControllerDriverFormat(&childBuf, def) < 0) + goto cleanup; if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0) goto cleanup; -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:27AM +0100, Peter Krempa wrote:
Refactor adding of the controller <driver> element.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Refactor the function to use the XML formatting aid and use automatic cleaning to simplify the control flow. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 44 ++++++++++++++---------------------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e7c71bb43d..cbefa7749b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -24292,15 +24292,15 @@ virDomainControllerDefFormat(virBufferPtr buf, const char *type = virDomainControllerTypeToString(def->type); const char *model = NULL; const char *modelName = NULL; - virBuffer childBuf = VIR_BUFFER_INITIALIZER; - int ret = -1; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; virBufferSetChildIndent(&childBuf, buf); if (!type) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected controller type %d"), def->type); - goto cleanup; + return -1; } if (def->model != -1) { @@ -24309,32 +24309,32 @@ virDomainControllerDefFormat(virBufferPtr buf, if (!model) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected model type %d"), def->model); - goto cleanup; + return -1; } } - virBufferAsprintf(buf, - "<controller type='%s' index='%d'", + virBufferAsprintf(&attrBuf, + " type='%s' index='%d'", type, def->idx); if (model) - virBufferEscapeString(buf, " model='%s'", model); + virBufferEscapeString(&attrBuf, " model='%s'", model); switch (def->type) { case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: if (def->opts.vioserial.ports != -1) { - virBufferAsprintf(buf, " ports='%d'", + virBufferAsprintf(&attrBuf, " ports='%d'", def->opts.vioserial.ports); } if (def->opts.vioserial.vectors != -1) { - virBufferAsprintf(buf, " vectors='%d'", + virBufferAsprintf(&attrBuf, " vectors='%d'", def->opts.vioserial.vectors); } break; case VIR_DOMAIN_CONTROLLER_TYPE_USB: if (def->opts.usbopts.ports != -1) { - virBufferAsprintf(buf, " ports='%d'", + virBufferAsprintf(&attrBuf, " ports='%d'", def->opts.usbopts.ports); } break; @@ -24373,7 +24373,7 @@ virDomainControllerDefFormat(virBufferPtr buf, virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected model name value %d"), def->opts.pciopts.modelName); - goto cleanup; + return -1; } virBufferAsprintf(&childBuf, "<model name='%s'/>\n", modelName); } @@ -24414,10 +24414,10 @@ virDomainControllerDefFormat(virBufferPtr buf, } if (virDomainControllerDriverFormat(&childBuf, def) < 0) - goto cleanup; + return -1; if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0) - goto cleanup; + return -1; if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && def->opts.pciopts.pcihole64) { @@ -24425,23 +24425,7 @@ virDomainControllerDefFormat(virBufferPtr buf, "pcihole64>\n", def->opts.pciopts.pcihole64size); } - if (virBufferCheckError(&childBuf) < 0) - goto cleanup; - - if (virBufferUse(&childBuf)) { - virBufferAddLit(buf, ">\n"); - virBufferAddBuffer(buf, &childBuf); - virBufferAddLit(buf, "</controller>\n"); - } else { - virBufferAddLit(buf, "/>\n"); - } - - ret = 0; - - cleanup: - virBufferFreeAndReset(&childBuf); - - return ret; + return virXMLFormatElement(buf, "controller", &attrBuf, &childBuf); } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:28AM +0100, Peter Krempa wrote:
Refactor the function to use the XML formatting aid and use automatic
If you had split this according to this conjunction ^^^ it would have been slightly easier to read.
cleaning to simplify the control flow.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 44 ++++++++++++++---------------------------- 1 file changed, 14 insertions(+), 30 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use virXMLFormatElement to format the internals along with simplifying cleanup code paths. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 47 ++++++++++-------------------------------- 1 file changed, 11 insertions(+), 36 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cbefa7749b..fd3f19d6ce 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -25837,19 +25837,20 @@ virDomainMemballoonDefFormat(virBufferPtr buf, unsigned int flags) { const char *model = virDomainMemballoonModelTypeToString(def->model); - virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; - int ret = -1; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childrenBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) driverAttrBuf = VIR_BUFFER_INITIALIZER; if (!model) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected memballoon model %d"), def->model); - goto cleanup; + return -1; } - virBufferAsprintf(buf, "<memballoon model='%s'", model); + virBufferAsprintf(&attrBuf, " model='%s'", model); if (def->autodeflate != VIR_TRISTATE_SWITCH_ABSENT) - virBufferAsprintf(buf, " autodeflate='%s'", + virBufferAsprintf(&attrBuf, " autodeflate='%s'", virTristateSwitchTypeToString(def->autodeflate)); virBufferSetChildIndent(&childrenBuf, buf); @@ -25858,40 +25859,14 @@ virDomainMemballoonDefFormat(virBufferPtr buf, virBufferAsprintf(&childrenBuf, "<stats period='%i'/>\n", def->period); if (virDomainDeviceInfoFormat(&childrenBuf, &def->info, flags) < 0) - goto cleanup; - - if (def->virtio) { - virBuffer driverBuf = VIR_BUFFER_INITIALIZER; - - virDomainVirtioOptionsFormat(&driverBuf, def->virtio); - - if (virBufferCheckError(&driverBuf) < 0) - goto cleanup; - - if (virBufferUse(&driverBuf)) { - virBufferAddLit(&childrenBuf, "<driver"); - virBufferAddBuffer(&childrenBuf, &driverBuf); - virBufferAddLit(&childrenBuf, "/>\n"); - } - } - - if (virBufferCheckError(&childrenBuf) < 0) - goto cleanup; - - if (!virBufferUse(&childrenBuf)) { - virBufferAddLit(buf, "/>\n"); - } else { - virBufferAddLit(buf, ">\n"); - virBufferAddBuffer(buf, &childrenBuf); - virBufferAddLit(buf, "</memballoon>\n"); - } + return -1; - ret = 0; + virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio); - cleanup: - virBufferFreeAndReset(&childrenBuf); + if (virXMLFormatElement(&childrenBuf, "driver", &driverAttrBuf, NULL) < 0) + return -1; - return ret; + return virXMLFormatElement(buf, "memballoon", &attrBuf, &childrenBuf); } static int -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:29AM +0100, Peter Krempa wrote:
Use virXMLFormatElement to format the internals along with simplifying cleanup code paths.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 47 ++++++++++-------------------------------- 1 file changed, 11 insertions(+), 36 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index cbefa7749b..fd3f19d6ce 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -25858,40 +25859,14 @@ virDomainMemballoonDefFormat(virBufferPtr buf, virBufferAsprintf(&childrenBuf, "<stats period='%i'/>\n", def->period);
if (virDomainDeviceInfoFormat(&childrenBuf, &def->info, flags) < 0) - goto cleanup; - - if (def->virtio) { - virBuffer driverBuf = VIR_BUFFER_INITIALIZER; - - virDomainVirtioOptionsFormat(&driverBuf, def->virtio); - - if (virBufferCheckError(&driverBuf) < 0) - goto cleanup; - - if (virBufferUse(&driverBuf)) { - virBufferAddLit(&childrenBuf, "<driver"); - virBufferAddBuffer(&childrenBuf, &driverBuf); - virBufferAddLit(&childrenBuf, "/>\n"); - } - }
Eww, who added this? ;)
- - if (virBufferCheckError(&childrenBuf) < 0) - goto cleanup; - - if (!virBufferUse(&childrenBuf)) { - virBufferAddLit(buf, "/>\n"); - } else { - virBufferAddLit(buf, ">\n"); - virBufferAddBuffer(buf, &childrenBuf); - virBufferAddLit(buf, "</memballoon>\n"); - } + return -1;
- ret = 0; + virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio);
- cleanup: - virBufferFreeAndReset(&childrenBuf); + if (virXMLFormatElement(&childrenBuf, "driver", &driverAttrBuf, NULL) < 0) + return -1;
- return ret; + return virXMLFormatElement(buf, "memballoon", &attrBuf, &childrenBuf); }
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use virXMLFormatElement to format the internals along with simplifying cleanup code paths. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fd3f19d6ce..ed480bcf8e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -25893,46 +25893,29 @@ virDomainWatchdogDefFormat(virBufferPtr buf, { const char *model = virDomainWatchdogModelTypeToString(def->model); const char *action = virDomainWatchdogActionTypeToString(def->action); - virBuffer childBuf = VIR_BUFFER_INITIALIZER; - int ret = -1; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; virBufferSetChildIndent(&childBuf, buf); if (!model) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected watchdog model %d"), def->model); - goto cleanup; + return -1; } if (!action) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected watchdog action %d"), def->action); - goto cleanup; - } - - if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0) - goto cleanup; - - if (virBufferCheckError(&childBuf) < 0) - goto cleanup; - - virBufferAsprintf(buf, "<watchdog model='%s' action='%s'", - model, action); - - if (virBufferUse(&childBuf)) { - virBufferAddLit(buf, ">\n"); - virBufferAddBuffer(buf, &childBuf); - virBufferAddLit(buf, "</watchdog>\n"); - } else { - virBufferAddLit(buf, "/>\n"); + return -1; } - ret = 0; + virBufferAsprintf(&attrBuf, " model='%s' action='%s'", model, action); - cleanup: - virBufferFreeAndReset(&childBuf); + if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0) + return -1; - return ret; + return virXMLFormatElement(buf, "watchdog", &attrBuf, &childBuf); } static int virDomainPanicDefFormat(virBufferPtr buf, -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:30AM +0100, Peter Krempa wrote:
Use virXMLFormatElement to format the internals along with simplifying cleanup code paths.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use virXMLFormatElement to format the internals along with simplifying cleanup code paths. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ed480bcf8e..766846a557 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -25921,36 +25921,18 @@ virDomainWatchdogDefFormat(virBufferPtr buf, static int virDomainPanicDefFormat(virBufferPtr buf, virDomainPanicDefPtr def) { - virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; - int ret = -1; - - virBufferAddLit(buf, "<panic"); + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childrenBuf = VIR_BUFFER_INITIALIZER; if (def->model) - virBufferAsprintf(buf, " model='%s'", + virBufferAsprintf(&attrBuf, " model='%s'", virDomainPanicModelTypeToString(def->model)); virBufferSetChildIndent(&childrenBuf, buf); if (virDomainDeviceInfoFormat(&childrenBuf, &def->info, 0) < 0) - goto cleanup; - - if (virBufferCheckError(&childrenBuf) < 0) - goto cleanup; - - if (virBufferUse(&childrenBuf)) { - virBufferAddLit(buf, ">\n"); - virBufferAddBuffer(buf, &childrenBuf); - virBufferAddLit(buf, "</panic>\n"); - } else { - virBufferAddLit(buf, "/>\n"); - } - - ret = 0; - - cleanup: - virBufferFreeAndReset(&childrenBuf); + return -1; - return ret; + return virXMLFormatElement(buf, "panic", &attrBuf, &childrenBuf); } static int -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:31AM +0100, Peter Krempa wrote:
Use virXMLFormatElement to format the internals along with simplifying cleanup code paths.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use virXMLFormatElement to format the internals along with simplifying cleanup code paths. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 766846a557..71e0c8679b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -25982,8 +25982,7 @@ virDomainRNGDefFormat(virBufferPtr buf, { const char *model = virDomainRNGModelTypeToString(def->model); const char *backend = virDomainRNGBackendTypeToString(def->backend); - virBuffer driverBuf = VIR_BUFFER_INITIALIZER; - int ret = -1; + VIR_AUTOCLEAN(virBuffer) driverAttrBuf = VIR_BUFFER_INITIALIZER; virBufferAsprintf(buf, "<rng model='%s'>\n", model); virBufferAdjustIndent(buf, 2); @@ -26002,11 +26001,11 @@ virDomainRNGDefFormat(virBufferPtr buf, case VIR_DOMAIN_RNG_BACKEND_EGD: if (virDomainChrAttrsDefFormat(buf, def->source.chardev, false) < 0) - goto cleanup; + return -1; virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); if (virDomainChrSourceDefFormat(buf, def->source.chardev, flags) < 0) - goto cleanup; + return -1; virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</backend>\n"); @@ -26014,28 +26013,18 @@ virDomainRNGDefFormat(virBufferPtr buf, break; } - virDomainVirtioOptionsFormat(&driverBuf, def->virtio); - if (virBufferCheckError(&driverBuf) < 0) - goto cleanup; + virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio); - if (virBufferUse(&driverBuf)) { - virBufferAddLit(buf, "<driver"); - virBufferAddBuffer(buf, &driverBuf); - virBufferAddLit(buf, "/>\n"); - } + if (virXMLFormatElement(buf, "driver", &driverAttrBuf, NULL) < 0) + return -1; if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0) - goto cleanup; + return -1; virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</rng>\n"); - ret = 0; - - cleanup: - virBufferFreeAndReset(&driverBuf); - - return ret; + return 0; } void -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:32AM +0100, Peter Krempa wrote:
Use virXMLFormatElement to format the internals along with simplifying cleanup code paths.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use virXMLFormatElement to format the internals along with simplifying cleanup code paths. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 54 +++++++++++++----------------------------- 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 71e0c8679b..83e11f603f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -26244,9 +26244,9 @@ virDomainInputDefFormat(virBufferPtr buf, { const char *type = virDomainInputTypeToString(def->type); const char *bus = virDomainInputBusTypeToString(def->bus); - virBuffer childbuf = VIR_BUFFER_INITIALIZER; - virBuffer driverBuf = VIR_BUFFER_INITIALIZER; - int ret = -1; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) driverAttrBuf = VIR_BUFFER_INITIALIZER; /* don't format keyboard into migratable XML for backward compatibility */ if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE && @@ -26258,16 +26258,15 @@ virDomainInputDefFormat(virBufferPtr buf, if (!type) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected input type %d"), def->type); - goto cleanup; + return -1; } if (!bus) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected input bus type %d"), def->bus); - goto cleanup; + return -1; } - virBufferAsprintf(buf, "<input type='%s' bus='%s'", - type, bus); + virBufferAsprintf(&attrBuf, " type='%s' bus='%s'", type, bus); if (def->model) { const char *model = virDomainInputModelTypeToString(def->model); @@ -26275,44 +26274,23 @@ virDomainInputDefFormat(virBufferPtr buf, if (!model) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected input model %d"), def->model); - goto cleanup; + return -1; } - virBufferAsprintf(buf, " model='%s'", model); + virBufferAsprintf(&attrBuf, " model='%s'", model); } - virBufferSetChildIndent(&childbuf, buf); - virDomainVirtioOptionsFormat(&driverBuf, def->virtio); - if (virBufferCheckError(&driverBuf) < 0) - goto cleanup; - - if (virBufferUse(&driverBuf)) { - virBufferAddLit(&childbuf, "<driver"); - virBufferAddBuffer(&childbuf, &driverBuf); - virBufferAddLit(&childbuf, "/>\n"); - } - virBufferEscapeString(&childbuf, "<source evdev='%s'/>\n", def->source.evdev); - if (virDomainDeviceInfoFormat(&childbuf, &def->info, flags) < 0) - goto cleanup; - - if (virBufferCheckError(&childbuf) < 0) - goto cleanup; - - if (!virBufferUse(&childbuf)) { - virBufferAddLit(buf, "/>\n"); - } else { - virBufferAddLit(buf, ">\n"); - virBufferAddBuffer(buf, &childbuf); - virBufferAddLit(buf, "</input>\n"); - } + virBufferSetChildIndent(&childBuf, buf); + virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio); - ret = 0; + if (virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, NULL) < 0) + return -1; - cleanup: - virBufferFreeAndReset(&childbuf); - virBufferFreeAndReset(&driverBuf); + virBufferEscapeString(&childBuf, "<source evdev='%s'/>\n", def->source.evdev); + if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0) + return -1; - return ret; + return virXMLFormatElement(buf, "input", &attrBuf, &childBuf); } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:33AM +0100, Peter Krempa wrote:
Use virXMLFormatElement to format the internals along with simplifying cleanup code paths.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 54 +++++++++++++----------------------------- 1 file changed, 16 insertions(+), 38 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use virXMLFormatElement to format the internals along with simplifying cleanup code paths. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 83e11f603f..5d745f8bce 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -26976,38 +26976,23 @@ virDomainHubDefFormat(virBufferPtr buf, unsigned int flags) { const char *type = virDomainHubTypeToString(def->type); - virBuffer childBuf = VIR_BUFFER_INITIALIZER; - int ret = -1; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; virBufferSetChildIndent(&childBuf, buf); if (!type) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected hub type %d"), def->type); - goto cleanup; + return -1; } if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0) - goto cleanup; - - if (virBufferCheckError(&childBuf) < 0) - goto cleanup; - - virBufferAsprintf(buf, "<hub type='%s'", type); - if (virBufferUse(&childBuf)) { - virBufferAddLit(buf, ">\n"); - virBufferAddBuffer(buf, &childBuf); - virBufferAddLit(buf, "</hub>\n"); - } else { - virBufferAddLit(buf, "/>\n"); - } - - ret = 0; + return -1; - cleanup: - virBufferFreeAndReset(&childBuf); + virBufferAsprintf(&attrBuf, " type='%s'", type); - return ret; + return virXMLFormatElement(buf, "hub", &attrBuf, &childBuf); } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:34AM +0100, Peter Krempa wrote:
Use virXMLFormatElement to format the internals along with simplifying cleanup code paths.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Split out the code into a separate function named virDomainDefFormatBlkiotune and use virXMLFormatElement. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 89 ++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5d745f8bce..01ec5c8ca9 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27696,6 +27696,51 @@ virDomainVsockDefFormat(virBufferPtr buf, } +static int +virDomainDefFormatBlkiotune(virBufferPtr buf, + virDomainDefPtr def) +{ + VIR_AUTOCLEAN(virBuffer) childrenBuf = VIR_BUFFER_INITIALIZER; + ssize_t n; + + virBufferSetChildIndent(&childrenBuf, buf); + if (def->blkio.weight) + virBufferAsprintf(&childrenBuf, "<weight>%u</weight>\n", + def->blkio.weight); + + for (n = 0; n < def->blkio.ndevices; n++) { + virBlkioDevicePtr dev = &def->blkio.devices[n]; + + if (!dev->weight && !dev->riops && !dev->wiops && + !dev->rbps && !dev->wbps) + continue; + virBufferAddLit(&childrenBuf, "<device>\n"); + virBufferAdjustIndent(&childrenBuf, 2); + virBufferEscapeString(&childrenBuf, "<path>%s</path>\n", + dev->path); + if (dev->weight) + virBufferAsprintf(&childrenBuf, "<weight>%u</weight>\n", + dev->weight); + if (dev->riops) + virBufferAsprintf(&childrenBuf, "<read_iops_sec>%u</read_iops_sec>\n", + dev->riops); + if (dev->wiops) + virBufferAsprintf(&childrenBuf, "<write_iops_sec>%u</write_iops_sec>\n", + dev->wiops); + if (dev->rbps) + virBufferAsprintf(&childrenBuf, "<read_bytes_sec>%llu</read_bytes_sec>\n", + dev->rbps); + if (dev->wbps) + virBufferAsprintf(&childrenBuf, "<write_bytes_sec>%llu</write_bytes_sec>\n", + dev->wbps); + virBufferAdjustIndent(&childrenBuf, -2); + virBufferAddLit(&childrenBuf, "</device>\n"); + } + + return virXMLFormatElement(buf, "blkiotune", NULL, &childrenBuf); +} + + /* This internal version appends to an existing buffer * (possibly with auto-indent), rather than flattening * to string. @@ -27797,51 +27842,9 @@ virDomainDefFormatInternal(virDomainDefPtr def, virBufferAsprintf(buf, "<currentMemory unit='KiB'>%llu</currentMemory>\n", def->mem.cur_balloon); - /* start format blkiotune */ - virBufferSetChildIndent(&childrenBuf, buf); - if (def->blkio.weight) - virBufferAsprintf(&childrenBuf, "<weight>%u</weight>\n", - def->blkio.weight); - - for (n = 0; n < def->blkio.ndevices; n++) { - virBlkioDevicePtr dev = &def->blkio.devices[n]; - - if (!dev->weight && !dev->riops && !dev->wiops && - !dev->rbps && !dev->wbps) - continue; - virBufferAddLit(&childrenBuf, "<device>\n"); - virBufferAdjustIndent(&childrenBuf, 2); - virBufferEscapeString(&childrenBuf, "<path>%s</path>\n", - dev->path); - if (dev->weight) - virBufferAsprintf(&childrenBuf, "<weight>%u</weight>\n", - dev->weight); - if (dev->riops) - virBufferAsprintf(&childrenBuf, "<read_iops_sec>%u</read_iops_sec>\n", - dev->riops); - if (dev->wiops) - virBufferAsprintf(&childrenBuf, "<write_iops_sec>%u</write_iops_sec>\n", - dev->wiops); - if (dev->rbps) - virBufferAsprintf(&childrenBuf, "<read_bytes_sec>%llu</read_bytes_sec>\n", - dev->rbps); - if (dev->wbps) - virBufferAsprintf(&childrenBuf, "<write_bytes_sec>%llu</write_bytes_sec>\n", - dev->wbps); - virBufferAdjustIndent(&childrenBuf, -2); - virBufferAddLit(&childrenBuf, "</device>\n"); - } - - if (virBufferCheckError(&childrenBuf) < 0) + if (virDomainDefFormatBlkiotune(buf, def) < 0) goto error; - if (virBufferUse(&childrenBuf)) { - virBufferAddLit(buf, "<blkiotune>\n"); - virBufferAddBuffer(buf, &childrenBuf); - virBufferAddLit(buf, "</blkiotune>\n"); - } - virBufferFreeAndReset(&childrenBuf); - if (virDomainMemtuneFormat(buf, &def->mem) < 0) goto error; -- 2.20.1

s/Split out/refactor/ Alternatively, separate the split from the AUTOCLEAN and FormatElement changes. On Wed, Mar 06, 2019 at 09:20:35AM +0100, Peter Krempa wrote:
Split out the code into a separate function named virDomainDefFormatBlkiotune and use virXMLFormatElement.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 89 ++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 43 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Pure code motion of code for formatting domain features to a function called virDomainDefFormatFeatures. Best viewed with the '--patience' option for git show. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 760 +++++++++++++++++++++-------------------- 1 file changed, 388 insertions(+), 372 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 01ec5c8ca9..215fb111bb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27741,277 +27741,13 @@ virDomainDefFormatBlkiotune(virBufferPtr buf, } -/* This internal version appends to an existing buffer - * (possibly with auto-indent), rather than flattening - * to string. - * Return -1 on failure. */ -int -virDomainDefFormatInternal(virDomainDefPtr def, - virCapsPtr caps, - unsigned int flags, - virBufferPtr buf, - virDomainXMLOptionPtr xmlopt) +static int +virDomainDefFormatFeatures(virBufferPtr buf, + virDomainDefPtr def) { - unsigned char *uuid; - char uuidstr[VIR_UUID_STRING_BUFLEN]; - const char *type = NULL; - int n; - size_t i; virBuffer attributeBuf = VIR_BUFFER_INITIALIZER; virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; - char *netprefix = NULL; - - virCheckFlags(VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS | - VIR_DOMAIN_DEF_FORMAT_STATUS | - VIR_DOMAIN_DEF_FORMAT_ACTUAL_NET | - VIR_DOMAIN_DEF_FORMAT_PCI_ORIG_STATES | - VIR_DOMAIN_DEF_FORMAT_CLOCK_ADJUST, - -1); - - if (!(type = virDomainVirtTypeToString(def->virtType))) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected domain type %d"), def->virtType); - goto error; - } - - if (def->id == -1) - flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE; - - virBufferAsprintf(buf, "<domain type='%s'", type); - if (!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE)) - virBufferAsprintf(buf, " id='%d'", def->id); - if (def->namespaceData && def->ns.href) - virBufferAsprintf(buf, " %s", (def->ns.href)()); - virBufferAddLit(buf, ">\n"); - virBufferAdjustIndent(buf, 2); - - virBufferEscapeString(buf, "<name>%s</name>\n", def->name); - - uuid = def->uuid; - virUUIDFormat(uuid, uuidstr); - virBufferAsprintf(buf, "<uuid>%s</uuid>\n", uuidstr); - - if (def->genidRequested) { - char genidstr[VIR_UUID_STRING_BUFLEN]; - - virUUIDFormat(def->genid, genidstr); - virBufferAsprintf(buf, "<genid>%s</genid>\n", genidstr); - } - - virBufferEscapeString(buf, "<title>%s</title>\n", def->title); - - virBufferEscapeString(buf, "<description>%s</description>\n", - def->description); - - if (def->metadata) { - xmlBufferPtr xmlbuf; - int oldIndentTreeOutput = xmlIndentTreeOutput; - - /* Indentation on output requires that we previously set - * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2 - * spaces per level of indentation of intermediate elements, - * but no leading indentation before the starting element. - * Thankfully, libxml maps what looks like globals into - * thread-local uses, so we are thread-safe. */ - xmlIndentTreeOutput = 1; - xmlbuf = xmlBufferCreate(); - if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata, - virBufferGetIndent(buf, false) / 2, 1) < 0) { - xmlBufferFree(xmlbuf); - xmlIndentTreeOutput = oldIndentTreeOutput; - goto error; - } - virBufferAsprintf(buf, "%s\n", (char *) xmlBufferContent(xmlbuf)); - xmlBufferFree(xmlbuf); - xmlIndentTreeOutput = oldIndentTreeOutput; - } - - if (virDomainDefHasMemoryHotplug(def)) { - virBufferAsprintf(buf, - "<maxMemory slots='%u' unit='KiB'>%llu</maxMemory>\n", - def->mem.memory_slots, def->mem.max_memory); - } - - virBufferAddLit(buf, "<memory"); - if (def->mem.dump_core) - virBufferAsprintf(buf, " dumpCore='%s'", - virTristateSwitchTypeToString(def->mem.dump_core)); - virBufferAsprintf(buf, " unit='KiB'>%llu</memory>\n", - virDomainDefGetMemoryTotal(def)); - - virBufferAsprintf(buf, "<currentMemory unit='KiB'>%llu</currentMemory>\n", - def->mem.cur_balloon); - - if (virDomainDefFormatBlkiotune(buf, def) < 0) - goto error; - - if (virDomainMemtuneFormat(buf, &def->mem) < 0) - goto error; - - if (virDomainCpuDefFormat(buf, def) < 0) - goto error; - - if (def->niothreadids > 0) { - virBufferAsprintf(buf, "<iothreads>%zu</iothreads>\n", - def->niothreadids); - if (virDomainDefIothreadShouldFormat(def)) { - virBufferAddLit(buf, "<iothreadids>\n"); - virBufferAdjustIndent(buf, 2); - for (i = 0; i < def->niothreadids; i++) { - virBufferAsprintf(buf, "<iothread id='%u'/>\n", - def->iothreadids[i]->iothread_id); - } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</iothreadids>\n"); - } - } - - if (virDomainCputuneDefFormat(buf, def, flags) < 0) - goto error; - - if (virDomainNumatuneFormatXML(buf, def->numa) < 0) - goto error; - - if (def->resource) - virDomainResourceDefFormat(buf, def->resource); - - if (def->sysinfo) - ignore_value(virSysinfoFormat(buf, def->sysinfo)); - - if (def->os.bootloader) { - virBufferEscapeString(buf, "<bootloader>%s</bootloader>\n", - def->os.bootloader); - virBufferEscapeString(buf, - "<bootloader_args>%s</bootloader_args>\n", - def->os.bootloaderArgs); - } - - virBufferAddLit(buf, "<os>\n"); - virBufferAdjustIndent(buf, 2); - virBufferAddLit(buf, "<type"); - if (def->os.arch) - virBufferAsprintf(buf, " arch='%s'", virArchToString(def->os.arch)); - if (def->os.machine) - virBufferAsprintf(buf, " machine='%s'", def->os.machine); - /* - * HACK: For xen driver we previously used bogus 'linux' as the - * os type for paravirt, whereas capabilities declare it to - * be 'xen'. So we convert to the former for backcompat - */ - if (def->virtType == VIR_DOMAIN_VIRT_XEN && - def->os.type == VIR_DOMAIN_OSTYPE_XEN) - virBufferAsprintf(buf, ">%s</type>\n", - virDomainOSTypeToString(VIR_DOMAIN_OSTYPE_LINUX)); - else - virBufferAsprintf(buf, ">%s</type>\n", - virDomainOSTypeToString(def->os.type)); - - virBufferEscapeString(buf, "<init>%s</init>\n", - def->os.init); - for (i = 0; def->os.initargv && def->os.initargv[i]; i++) - virBufferEscapeString(buf, "<initarg>%s</initarg>\n", - def->os.initargv[i]); - for (i = 0; def->os.initenv && def->os.initenv[i]; i++) - virBufferAsprintf(buf, "<initenv name='%s'>%s</initenv>\n", - def->os.initenv[i]->name, def->os.initenv[i]->value); - if (def->os.initdir) - virBufferEscapeString(buf, "<initdir>%s</initdir>\n", - def->os.initdir); - if (def->os.inituser) - virBufferAsprintf(buf, "<inituser>%s</inituser>\n", def->os.inituser); - if (def->os.initgroup) - virBufferAsprintf(buf, "<initgroup>%s</initgroup>\n", def->os.initgroup); - - if (def->os.loader) - virDomainLoaderDefFormat(buf, def->os.loader); - virBufferEscapeString(buf, "<kernel>%s</kernel>\n", - def->os.kernel); - virBufferEscapeString(buf, "<initrd>%s</initrd>\n", - def->os.initrd); - virBufferEscapeString(buf, "<cmdline>%s</cmdline>\n", - def->os.cmdline); - virBufferEscapeString(buf, "<dtb>%s</dtb>\n", - def->os.dtb); - virBufferEscapeString(buf, "<root>%s</root>\n", - def->os.root); - if (def->os.slic_table) { - virBufferAddLit(buf, "<acpi>\n"); - virBufferAdjustIndent(buf, 2); - virBufferEscapeString(buf, "<table type='slic'>%s</table>\n", - def->os.slic_table); - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</acpi>\n"); - } - - if (!def->os.bootloader) { - for (n = 0; n < def->os.nBootDevs; n++) { - const char *boottype = - virDomainBootTypeToString(def->os.bootDevs[n]); - if (!boottype) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected boot device type %d"), - def->os.bootDevs[n]); - goto error; - } - virBufferAsprintf(buf, "<boot dev='%s'/>\n", boottype); - } - - if (def->os.bootmenu) { - virBufferAsprintf(buf, "<bootmenu enable='%s'", - virTristateBoolTypeToString(def->os.bootmenu)); - if (def->os.bm_timeout_set) - virBufferAsprintf(buf, " timeout='%u'", def->os.bm_timeout); - virBufferAddLit(buf, "/>\n"); - } - - if (def->os.bios.useserial || def->os.bios.rt_set) { - virBufferAddLit(buf, "<bios"); - if (def->os.bios.useserial) - virBufferAsprintf(buf, " useserial='%s'", - virTristateBoolTypeToString(def->os.bios.useserial)); - if (def->os.bios.rt_set) - virBufferAsprintf(buf, " rebootTimeout='%d'", def->os.bios.rt_delay); - - virBufferAddLit(buf, "/>\n"); - } - } - - if (def->os.smbios_mode) { - const char *mode; - - mode = virDomainSmbiosModeTypeToString(def->os.smbios_mode); - if (mode == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected smbios mode %d"), def->os.smbios_mode); - goto error; - } - virBufferAsprintf(buf, "<smbios mode='%s'/>\n", mode); - } - - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</os>\n"); - - - if (def->idmap.uidmap) { - virBufferAddLit(buf, "<idmap>\n"); - virBufferAdjustIndent(buf, 2); - for (i = 0; i < def->idmap.nuidmap; i++) { - virBufferAsprintf(buf, - "<uid start='%u' target='%u' count='%u'/>\n", - def->idmap.uidmap[i].start, - def->idmap.uidmap[i].target, - def->idmap.uidmap[i].count); - } - for (i = 0; i < def->idmap.ngidmap; i++) { - virBufferAsprintf(buf, - "<gid start='%u' target='%u' count='%u'/>\n", - def->idmap.gidmap[i].start, - def->idmap.gidmap[i].target, - def->idmap.gidmap[i].count); - } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</idmap>\n"); - } + size_t i; for (i = 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT) @@ -28156,130 +27892,412 @@ virDomainDefFormatInternal(virDomainDefPtr def, def->hyperv_spinlocks); break; - case VIR_DOMAIN_HYPERV_VENDOR_ID: - if (def->hyperv_features[j] != VIR_TRISTATE_SWITCH_ON) - break; - virBufferEscapeString(buf, " value='%s'", - def->hyperv_vendor_id); - break; + case VIR_DOMAIN_HYPERV_VENDOR_ID: + if (def->hyperv_features[j] != VIR_TRISTATE_SWITCH_ON) + break; + virBufferEscapeString(buf, " value='%s'", + def->hyperv_vendor_id); + break; + + /* coverity[dead_error_begin] */ + case VIR_DOMAIN_HYPERV_LAST: + break; + } + + virBufferAddLit(buf, "/>\n"); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</hyperv>\n"); + break; + + case VIR_DOMAIN_FEATURE_KVM: + if (def->features[i] != VIR_TRISTATE_SWITCH_ON) + break; + + virBufferAddLit(buf, "<kvm>\n"); + virBufferAdjustIndent(buf, 2); + for (j = 0; j < VIR_DOMAIN_KVM_LAST; j++) { + switch ((virDomainKVM) j) { + case VIR_DOMAIN_KVM_HIDDEN: + if (def->kvm_features[j]) + virBufferAsprintf(buf, "<%s state='%s'/>\n", + virDomainKVMTypeToString(j), + virTristateSwitchTypeToString( + def->kvm_features[j])); + break; + + /* coverity[dead_error_begin] */ + case VIR_DOMAIN_KVM_LAST: + break; + } + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</kvm>\n"); + break; + + case VIR_DOMAIN_FEATURE_CAPABILITIES: + if (def->features[i] == VIR_DOMAIN_CAPABILITIES_POLICY_DEFAULT && + !virDomainDefHasCapabilitiesFeatures(def)) { + break; + } + + virBufferAsprintf(buf, "<capabilities policy='%s'>\n", + virDomainCapabilitiesPolicyTypeToString(def->features[i])); + virBufferAdjustIndent(buf, 2); + for (j = 0; j < VIR_DOMAIN_CAPS_FEATURE_LAST; j++) { + if (def->caps_features[j] != VIR_TRISTATE_SWITCH_ABSENT) + virBufferAsprintf(buf, "<%s state='%s'/>\n", + virDomainCapsFeatureTypeToString(j), + virTristateSwitchTypeToString( + def->caps_features[j])); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</capabilities>\n"); + break; + + case VIR_DOMAIN_FEATURE_GIC: + if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { + virBufferAddLit(buf, "<gic"); + if (def->gic_version != VIR_GIC_VERSION_NONE) + virBufferAsprintf(buf, " version='%s'", + virGICVersionTypeToString(def->gic_version)); + virBufferAddLit(buf, "/>\n"); + } + break; + + case VIR_DOMAIN_FEATURE_IOAPIC: + if (def->features[i] == VIR_DOMAIN_IOAPIC_NONE) + break; + + virBufferAsprintf(buf, "<ioapic driver='%s'/>\n", + virDomainIOAPICTypeToString(def->features[i])); + break; + + case VIR_DOMAIN_FEATURE_HPT: + if (def->features[i] != VIR_TRISTATE_SWITCH_ON) + break; + + virBufferFreeAndReset(&attributeBuf); + virBufferFreeAndReset(&childrenBuf); + + if (def->hpt_resizing != VIR_DOMAIN_HPT_RESIZING_NONE) { + virBufferAsprintf(&attributeBuf, + " resizing='%s'", + virDomainHPTResizingTypeToString(def->hpt_resizing)); + } + if (def->hpt_maxpagesize > 0) { + virBufferSetChildIndent(&childrenBuf, buf); + virBufferAsprintf(&childrenBuf, + "<maxpagesize unit='KiB'>%llu</maxpagesize>\n", + def->hpt_maxpagesize); + } + + if (virXMLFormatElement(buf, "hpt", + &attributeBuf, &childrenBuf) < 0) { + goto error; + } + break; + + case VIR_DOMAIN_FEATURE_MSRS: + if (def->features[i] != VIR_TRISTATE_SWITCH_ON) + break; + + virBufferAsprintf(buf, "<msrs unknown='%s'/>\n", + virDomainMsrsUnknownTypeToString(def->msrs_features[VIR_DOMAIN_MSRS_UNKNOWN])); + break; + + /* coverity[dead_error_begin] */ + case VIR_DOMAIN_FEATURE_LAST: + break; + } + } + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</features>\n"); + } + + return 0; + + error: + virBufferFreeAndReset(&attributeBuf); + virBufferFreeAndReset(&childrenBuf); + return -1; +} + + +/* This internal version appends to an existing buffer + * (possibly with auto-indent), rather than flattening + * to string. + * Return -1 on failure. */ +int +virDomainDefFormatInternal(virDomainDefPtr def, + virCapsPtr caps, + unsigned int flags, + virBufferPtr buf, + virDomainXMLOptionPtr xmlopt) +{ + unsigned char *uuid; + char uuidstr[VIR_UUID_STRING_BUFLEN]; + const char *type = NULL; + int n; + size_t i; + char *netprefix = NULL; + + virCheckFlags(VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS | + VIR_DOMAIN_DEF_FORMAT_STATUS | + VIR_DOMAIN_DEF_FORMAT_ACTUAL_NET | + VIR_DOMAIN_DEF_FORMAT_PCI_ORIG_STATES | + VIR_DOMAIN_DEF_FORMAT_CLOCK_ADJUST, + -1); + + if (!(type = virDomainVirtTypeToString(def->virtType))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected domain type %d"), def->virtType); + goto error; + } + + if (def->id == -1) + flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE; + + virBufferAsprintf(buf, "<domain type='%s'", type); + if (!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE)) + virBufferAsprintf(buf, " id='%d'", def->id); + if (def->namespaceData && def->ns.href) + virBufferAsprintf(buf, " %s", (def->ns.href)()); + virBufferAddLit(buf, ">\n"); + virBufferAdjustIndent(buf, 2); + + virBufferEscapeString(buf, "<name>%s</name>\n", def->name); + + uuid = def->uuid; + virUUIDFormat(uuid, uuidstr); + virBufferAsprintf(buf, "<uuid>%s</uuid>\n", uuidstr); + + if (def->genidRequested) { + char genidstr[VIR_UUID_STRING_BUFLEN]; + + virUUIDFormat(def->genid, genidstr); + virBufferAsprintf(buf, "<genid>%s</genid>\n", genidstr); + } + + virBufferEscapeString(buf, "<title>%s</title>\n", def->title); + + virBufferEscapeString(buf, "<description>%s</description>\n", + def->description); + + if (def->metadata) { + xmlBufferPtr xmlbuf; + int oldIndentTreeOutput = xmlIndentTreeOutput; + + /* Indentation on output requires that we previously set + * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2 + * spaces per level of indentation of intermediate elements, + * but no leading indentation before the starting element. + * Thankfully, libxml maps what looks like globals into + * thread-local uses, so we are thread-safe. */ + xmlIndentTreeOutput = 1; + xmlbuf = xmlBufferCreate(); + if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata, + virBufferGetIndent(buf, false) / 2, 1) < 0) { + xmlBufferFree(xmlbuf); + xmlIndentTreeOutput = oldIndentTreeOutput; + goto error; + } + virBufferAsprintf(buf, "%s\n", (char *) xmlBufferContent(xmlbuf)); + xmlBufferFree(xmlbuf); + xmlIndentTreeOutput = oldIndentTreeOutput; + } + + if (virDomainDefHasMemoryHotplug(def)) { + virBufferAsprintf(buf, + "<maxMemory slots='%u' unit='KiB'>%llu</maxMemory>\n", + def->mem.memory_slots, def->mem.max_memory); + } + + virBufferAddLit(buf, "<memory"); + if (def->mem.dump_core) + virBufferAsprintf(buf, " dumpCore='%s'", + virTristateSwitchTypeToString(def->mem.dump_core)); + virBufferAsprintf(buf, " unit='KiB'>%llu</memory>\n", + virDomainDefGetMemoryTotal(def)); + + virBufferAsprintf(buf, "<currentMemory unit='KiB'>%llu</currentMemory>\n", + def->mem.cur_balloon); + + if (virDomainDefFormatBlkiotune(buf, def) < 0) + goto error; - /* coverity[dead_error_begin] */ - case VIR_DOMAIN_HYPERV_LAST: - break; - } + if (virDomainMemtuneFormat(buf, &def->mem) < 0) + goto error; - virBufferAddLit(buf, "/>\n"); - } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</hyperv>\n"); - break; + if (virDomainCpuDefFormat(buf, def) < 0) + goto error; - case VIR_DOMAIN_FEATURE_KVM: - if (def->features[i] != VIR_TRISTATE_SWITCH_ON) - break; + if (def->niothreadids > 0) { + virBufferAsprintf(buf, "<iothreads>%zu</iothreads>\n", + def->niothreadids); + if (virDomainDefIothreadShouldFormat(def)) { + virBufferAddLit(buf, "<iothreadids>\n"); + virBufferAdjustIndent(buf, 2); + for (i = 0; i < def->niothreadids; i++) { + virBufferAsprintf(buf, "<iothread id='%u'/>\n", + def->iothreadids[i]->iothread_id); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</iothreadids>\n"); + } + } - virBufferAddLit(buf, "<kvm>\n"); - virBufferAdjustIndent(buf, 2); - for (j = 0; j < VIR_DOMAIN_KVM_LAST; j++) { - switch ((virDomainKVM) j) { - case VIR_DOMAIN_KVM_HIDDEN: - if (def->kvm_features[j]) - virBufferAsprintf(buf, "<%s state='%s'/>\n", - virDomainKVMTypeToString(j), - virTristateSwitchTypeToString( - def->kvm_features[j])); - break; + if (virDomainCputuneDefFormat(buf, def, flags) < 0) + goto error; - /* coverity[dead_error_begin] */ - case VIR_DOMAIN_KVM_LAST: - break; - } - } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</kvm>\n"); - break; + if (virDomainNumatuneFormatXML(buf, def->numa) < 0) + goto error; - case VIR_DOMAIN_FEATURE_CAPABILITIES: - if (def->features[i] == VIR_DOMAIN_CAPABILITIES_POLICY_DEFAULT && - !virDomainDefHasCapabilitiesFeatures(def)) { - break; - } + if (def->resource) + virDomainResourceDefFormat(buf, def->resource); - virBufferAsprintf(buf, "<capabilities policy='%s'>\n", - virDomainCapabilitiesPolicyTypeToString(def->features[i])); - virBufferAdjustIndent(buf, 2); - for (j = 0; j < VIR_DOMAIN_CAPS_FEATURE_LAST; j++) { - if (def->caps_features[j] != VIR_TRISTATE_SWITCH_ABSENT) - virBufferAsprintf(buf, "<%s state='%s'/>\n", - virDomainCapsFeatureTypeToString(j), - virTristateSwitchTypeToString( - def->caps_features[j])); - } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</capabilities>\n"); - break; + if (def->sysinfo) + ignore_value(virSysinfoFormat(buf, def->sysinfo)); - case VIR_DOMAIN_FEATURE_GIC: - if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { - virBufferAddLit(buf, "<gic"); - if (def->gic_version != VIR_GIC_VERSION_NONE) - virBufferAsprintf(buf, " version='%s'", - virGICVersionTypeToString(def->gic_version)); - virBufferAddLit(buf, "/>\n"); - } - break; + if (def->os.bootloader) { + virBufferEscapeString(buf, "<bootloader>%s</bootloader>\n", + def->os.bootloader); + virBufferEscapeString(buf, + "<bootloader_args>%s</bootloader_args>\n", + def->os.bootloaderArgs); + } - case VIR_DOMAIN_FEATURE_IOAPIC: - if (def->features[i] == VIR_DOMAIN_IOAPIC_NONE) - break; + virBufferAddLit(buf, "<os>\n"); + virBufferAdjustIndent(buf, 2); + virBufferAddLit(buf, "<type"); + if (def->os.arch) + virBufferAsprintf(buf, " arch='%s'", virArchToString(def->os.arch)); + if (def->os.machine) + virBufferAsprintf(buf, " machine='%s'", def->os.machine); + /* + * HACK: For xen driver we previously used bogus 'linux' as the + * os type for paravirt, whereas capabilities declare it to + * be 'xen'. So we convert to the former for backcompat + */ + if (def->virtType == VIR_DOMAIN_VIRT_XEN && + def->os.type == VIR_DOMAIN_OSTYPE_XEN) + virBufferAsprintf(buf, ">%s</type>\n", + virDomainOSTypeToString(VIR_DOMAIN_OSTYPE_LINUX)); + else + virBufferAsprintf(buf, ">%s</type>\n", + virDomainOSTypeToString(def->os.type)); - virBufferAsprintf(buf, "<ioapic driver='%s'/>\n", - virDomainIOAPICTypeToString(def->features[i])); - break; + virBufferEscapeString(buf, "<init>%s</init>\n", + def->os.init); + for (i = 0; def->os.initargv && def->os.initargv[i]; i++) + virBufferEscapeString(buf, "<initarg>%s</initarg>\n", + def->os.initargv[i]); + for (i = 0; def->os.initenv && def->os.initenv[i]; i++) + virBufferAsprintf(buf, "<initenv name='%s'>%s</initenv>\n", + def->os.initenv[i]->name, def->os.initenv[i]->value); + if (def->os.initdir) + virBufferEscapeString(buf, "<initdir>%s</initdir>\n", + def->os.initdir); + if (def->os.inituser) + virBufferAsprintf(buf, "<inituser>%s</inituser>\n", def->os.inituser); + if (def->os.initgroup) + virBufferAsprintf(buf, "<initgroup>%s</initgroup>\n", def->os.initgroup); - case VIR_DOMAIN_FEATURE_HPT: - if (def->features[i] != VIR_TRISTATE_SWITCH_ON) - break; + if (def->os.loader) + virDomainLoaderDefFormat(buf, def->os.loader); + virBufferEscapeString(buf, "<kernel>%s</kernel>\n", + def->os.kernel); + virBufferEscapeString(buf, "<initrd>%s</initrd>\n", + def->os.initrd); + virBufferEscapeString(buf, "<cmdline>%s</cmdline>\n", + def->os.cmdline); + virBufferEscapeString(buf, "<dtb>%s</dtb>\n", + def->os.dtb); + virBufferEscapeString(buf, "<root>%s</root>\n", + def->os.root); + if (def->os.slic_table) { + virBufferAddLit(buf, "<acpi>\n"); + virBufferAdjustIndent(buf, 2); + virBufferEscapeString(buf, "<table type='slic'>%s</table>\n", + def->os.slic_table); + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</acpi>\n"); + } - virBufferFreeAndReset(&attributeBuf); - virBufferFreeAndReset(&childrenBuf); + if (!def->os.bootloader) { + for (n = 0; n < def->os.nBootDevs; n++) { + const char *boottype = + virDomainBootTypeToString(def->os.bootDevs[n]); + if (!boottype) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected boot device type %d"), + def->os.bootDevs[n]); + goto error; + } + virBufferAsprintf(buf, "<boot dev='%s'/>\n", boottype); + } - if (def->hpt_resizing != VIR_DOMAIN_HPT_RESIZING_NONE) { - virBufferAsprintf(&attributeBuf, - " resizing='%s'", - virDomainHPTResizingTypeToString(def->hpt_resizing)); - } - if (def->hpt_maxpagesize > 0) { - virBufferSetChildIndent(&childrenBuf, buf); - virBufferAsprintf(&childrenBuf, - "<maxpagesize unit='KiB'>%llu</maxpagesize>\n", - def->hpt_maxpagesize); - } + if (def->os.bootmenu) { + virBufferAsprintf(buf, "<bootmenu enable='%s'", + virTristateBoolTypeToString(def->os.bootmenu)); + if (def->os.bm_timeout_set) + virBufferAsprintf(buf, " timeout='%u'", def->os.bm_timeout); + virBufferAddLit(buf, "/>\n"); + } - if (virXMLFormatElement(buf, "hpt", - &attributeBuf, &childrenBuf) < 0) { - goto error; - } - break; + if (def->os.bios.useserial || def->os.bios.rt_set) { + virBufferAddLit(buf, "<bios"); + if (def->os.bios.useserial) + virBufferAsprintf(buf, " useserial='%s'", + virTristateBoolTypeToString(def->os.bios.useserial)); + if (def->os.bios.rt_set) + virBufferAsprintf(buf, " rebootTimeout='%d'", def->os.bios.rt_delay); - case VIR_DOMAIN_FEATURE_MSRS: - if (def->features[i] != VIR_TRISTATE_SWITCH_ON) - break; + virBufferAddLit(buf, "/>\n"); + } + } - virBufferAsprintf(buf, "<msrs unknown='%s'/>\n", - virDomainMsrsUnknownTypeToString(def->msrs_features[VIR_DOMAIN_MSRS_UNKNOWN])); - break; + if (def->os.smbios_mode) { + const char *mode; - /* coverity[dead_error_begin] */ - case VIR_DOMAIN_FEATURE_LAST: - break; - } + mode = virDomainSmbiosModeTypeToString(def->os.smbios_mode); + if (mode == NULL) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected smbios mode %d"), def->os.smbios_mode); + goto error; } + virBufferAsprintf(buf, "<smbios mode='%s'/>\n", mode); + } + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</os>\n"); + + if (def->idmap.uidmap) { + virBufferAddLit(buf, "<idmap>\n"); + virBufferAdjustIndent(buf, 2); + for (i = 0; i < def->idmap.nuidmap; i++) { + virBufferAsprintf(buf, + "<uid start='%u' target='%u' count='%u'/>\n", + def->idmap.uidmap[i].start, + def->idmap.uidmap[i].target, + def->idmap.uidmap[i].count); + } + for (i = 0; i < def->idmap.ngidmap; i++) { + virBufferAsprintf(buf, + "<gid start='%u' target='%u' count='%u'/>\n", + def->idmap.gidmap[i].start, + def->idmap.gidmap[i].target, + def->idmap.gidmap[i].count); + } virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</features>\n"); + virBufferAddLit(buf, "</idmap>\n"); } + if (virDomainDefFormatFeatures(buf, def) < 0) + goto error; + if (virCPUDefFormatBufFull(buf, def->cpu, def->numa) < 0) goto error; @@ -28528,8 +28546,6 @@ virDomainDefFormatInternal(virDomainDefPtr def, error: virBufferFreeAndReset(buf); - virBufferFreeAndReset(&childrenBuf); - virBufferFreeAndReset(&attributeBuf); return -1; } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:36AM +0100, Peter Krempa wrote:
Pure code motion of code for formatting domain features to a function called virDomainDefFormatFeatures. Best viewed with the '--patience' option for git show.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 760 +++++++++++++++++++++-------------------- 1 file changed, 388 insertions(+), 372 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use an early return to avoid one level of nesting scopes. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 423 +++++++++++++++++++++-------------------- 1 file changed, 212 insertions(+), 211 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 215fb111bb..70f3ac4fde 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27754,268 +27754,269 @@ virDomainDefFormatFeatures(virBufferPtr buf, break; } - if (i != VIR_DOMAIN_FEATURE_LAST || - virDomainDefHasCapabilitiesFeatures(def)) { - virBufferAddLit(buf, "<features>\n"); - virBufferAdjustIndent(buf, 2); - - for (i = 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { - const char *name = virDomainFeatureTypeToString(i); - size_t j; - - if (!name) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected feature %zu"), i); - goto error; - } - - switch ((virDomainFeature) i) { - case VIR_DOMAIN_FEATURE_ACPI: - case VIR_DOMAIN_FEATURE_PAE: - case VIR_DOMAIN_FEATURE_VIRIDIAN: - case VIR_DOMAIN_FEATURE_PRIVNET: - /* NOTE: This is for old style <opt/> booleans. New XML - * should use the explicit state=on|off output below */ - switch ((virTristateSwitch) def->features[i]) { - case VIR_TRISTATE_SWITCH_ABSENT: - break; + if (i == VIR_DOMAIN_FEATURE_LAST && + !virDomainDefHasCapabilitiesFeatures(def)) + return 0; - case VIR_TRISTATE_SWITCH_ON: - virBufferAsprintf(buf, "<%s/>\n", name); - break; + virBufferAddLit(buf, "<features>\n"); + virBufferAdjustIndent(buf, 2); - case VIR_TRISTATE_SWITCH_LAST: - case VIR_TRISTATE_SWITCH_OFF: - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unexpected state of feature '%s'"), name); + for (i = 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { + const char *name = virDomainFeatureTypeToString(i); + size_t j; - goto error; - break; - } + if (!name) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected feature %zu"), i); + goto error; + } + switch ((virDomainFeature) i) { + case VIR_DOMAIN_FEATURE_ACPI: + case VIR_DOMAIN_FEATURE_PAE: + case VIR_DOMAIN_FEATURE_VIRIDIAN: + case VIR_DOMAIN_FEATURE_PRIVNET: + /* NOTE: This is for old style <opt/> booleans. New XML + * should use the explicit state=on|off output below */ + switch ((virTristateSwitch) def->features[i]) { + case VIR_TRISTATE_SWITCH_ABSENT: break; - case VIR_DOMAIN_FEATURE_VMCOREINFO: - case VIR_DOMAIN_FEATURE_HAP: - case VIR_DOMAIN_FEATURE_PMU: - case VIR_DOMAIN_FEATURE_PVSPINLOCK: - case VIR_DOMAIN_FEATURE_VMPORT: - case VIR_DOMAIN_FEATURE_HTM: - case VIR_DOMAIN_FEATURE_NESTED_HV: - switch ((virTristateSwitch) def->features[i]) { - case VIR_TRISTATE_SWITCH_LAST: - case VIR_TRISTATE_SWITCH_ABSENT: - break; + case VIR_TRISTATE_SWITCH_ON: + virBufferAsprintf(buf, "<%s/>\n", name); + break; - case VIR_TRISTATE_SWITCH_ON: - virBufferAsprintf(buf, "<%s state='on'/>\n", name); - break; + case VIR_TRISTATE_SWITCH_LAST: + case VIR_TRISTATE_SWITCH_OFF: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected state of feature '%s'"), name); - case VIR_TRISTATE_SWITCH_OFF: - virBufferAsprintf(buf, "<%s state='off'/>\n", name); - break; - } + goto error; + break; + } - break; + break; - case VIR_DOMAIN_FEATURE_SMM: - if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT) { - virTristateSwitch state = def->features[i]; - virBuffer attrBuf = VIR_BUFFER_INITIALIZER; - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + case VIR_DOMAIN_FEATURE_VMCOREINFO: + case VIR_DOMAIN_FEATURE_HAP: + case VIR_DOMAIN_FEATURE_PMU: + case VIR_DOMAIN_FEATURE_PVSPINLOCK: + case VIR_DOMAIN_FEATURE_VMPORT: + case VIR_DOMAIN_FEATURE_HTM: + case VIR_DOMAIN_FEATURE_NESTED_HV: + switch ((virTristateSwitch) def->features[i]) { + case VIR_TRISTATE_SWITCH_LAST: + case VIR_TRISTATE_SWITCH_ABSENT: + break; - virBufferAsprintf(&attrBuf, " state='%s'", - virTristateSwitchTypeToString(state)); + case VIR_TRISTATE_SWITCH_ON: + virBufferAsprintf(buf, "<%s state='on'/>\n", name); + break; - if (state == VIR_TRISTATE_SWITCH_ON && - def->tseg_specified) { - const char *unit; - unsigned long long short_size = virFormatIntPretty(def->tseg_size, - &unit); + case VIR_TRISTATE_SWITCH_OFF: + virBufferAsprintf(buf, "<%s state='off'/>\n", name); + break; + } - virBufferSetChildIndent(&childBuf, buf); - virBufferAsprintf(&childBuf, "<tseg unit='%s'>%llu</tseg>\n", - unit, short_size); - } + break; - if (virXMLFormatElement(buf, "smm", &attrBuf, &childBuf) < 0) - goto error; + case VIR_DOMAIN_FEATURE_SMM: + if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT) { + virTristateSwitch state = def->features[i]; + virBuffer attrBuf = VIR_BUFFER_INITIALIZER; + virBuffer childBuf = VIR_BUFFER_INITIALIZER; + + virBufferAsprintf(&attrBuf, " state='%s'", + virTristateSwitchTypeToString(state)); + + if (state == VIR_TRISTATE_SWITCH_ON && + def->tseg_specified) { + const char *unit; + unsigned long long short_size = virFormatIntPretty(def->tseg_size, + &unit); + + virBufferSetChildIndent(&childBuf, buf); + virBufferAsprintf(&childBuf, "<tseg unit='%s'>%llu</tseg>\n", + unit, short_size); } - break; + if (virXMLFormatElement(buf, "smm", &attrBuf, &childBuf) < 0) + goto error; + } - case VIR_DOMAIN_FEATURE_APIC: - if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { - virBufferAddLit(buf, "<apic"); - if (def->apic_eoi) { - virBufferAsprintf(buf, " eoi='%s'", - virTristateSwitchTypeToString(def->apic_eoi)); - } - virBufferAddLit(buf, "/>\n"); + break; + + case VIR_DOMAIN_FEATURE_APIC: + if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { + virBufferAddLit(buf, "<apic"); + if (def->apic_eoi) { + virBufferAsprintf(buf, " eoi='%s'", + virTristateSwitchTypeToString(def->apic_eoi)); } + virBufferAddLit(buf, "/>\n"); + } + break; + + case VIR_DOMAIN_FEATURE_HYPERV: + if (def->features[i] != VIR_TRISTATE_SWITCH_ON) break; - case VIR_DOMAIN_FEATURE_HYPERV: - if (def->features[i] != VIR_TRISTATE_SWITCH_ON) + virBufferAddLit(buf, "<hyperv>\n"); + virBufferAdjustIndent(buf, 2); + for (j = 0; j < VIR_DOMAIN_HYPERV_LAST; j++) { + if (def->hyperv_features[j] == VIR_TRISTATE_SWITCH_ABSENT) + continue; + + virBufferAsprintf(buf, "<%s state='%s'", + virDomainHypervTypeToString(j), + virTristateSwitchTypeToString( + def->hyperv_features[j])); + + switch ((virDomainHyperv) j) { + case VIR_DOMAIN_HYPERV_RELAXED: + case VIR_DOMAIN_HYPERV_VAPIC: + case VIR_DOMAIN_HYPERV_VPINDEX: + case VIR_DOMAIN_HYPERV_RUNTIME: + case VIR_DOMAIN_HYPERV_SYNIC: + case VIR_DOMAIN_HYPERV_STIMER: + case VIR_DOMAIN_HYPERV_RESET: + case VIR_DOMAIN_HYPERV_FREQUENCIES: + case VIR_DOMAIN_HYPERV_REENLIGHTENMENT: + case VIR_DOMAIN_HYPERV_TLBFLUSH: + case VIR_DOMAIN_HYPERV_IPI: + case VIR_DOMAIN_HYPERV_EVMCS: break; - virBufferAddLit(buf, "<hyperv>\n"); - virBufferAdjustIndent(buf, 2); - for (j = 0; j < VIR_DOMAIN_HYPERV_LAST; j++) { - if (def->hyperv_features[j] == VIR_TRISTATE_SWITCH_ABSENT) - continue; - - virBufferAsprintf(buf, "<%s state='%s'", - virDomainHypervTypeToString(j), - virTristateSwitchTypeToString( - def->hyperv_features[j])); - - switch ((virDomainHyperv) j) { - case VIR_DOMAIN_HYPERV_RELAXED: - case VIR_DOMAIN_HYPERV_VAPIC: - case VIR_DOMAIN_HYPERV_VPINDEX: - case VIR_DOMAIN_HYPERV_RUNTIME: - case VIR_DOMAIN_HYPERV_SYNIC: - case VIR_DOMAIN_HYPERV_STIMER: - case VIR_DOMAIN_HYPERV_RESET: - case VIR_DOMAIN_HYPERV_FREQUENCIES: - case VIR_DOMAIN_HYPERV_REENLIGHTENMENT: - case VIR_DOMAIN_HYPERV_TLBFLUSH: - case VIR_DOMAIN_HYPERV_IPI: - case VIR_DOMAIN_HYPERV_EVMCS: + case VIR_DOMAIN_HYPERV_SPINLOCKS: + if (def->hyperv_features[j] != VIR_TRISTATE_SWITCH_ON) break; + virBufferAsprintf(buf, " retries='%d'", + def->hyperv_spinlocks); + break; - case VIR_DOMAIN_HYPERV_SPINLOCKS: - if (def->hyperv_features[j] != VIR_TRISTATE_SWITCH_ON) - break; - virBufferAsprintf(buf, " retries='%d'", - def->hyperv_spinlocks); + case VIR_DOMAIN_HYPERV_VENDOR_ID: + if (def->hyperv_features[j] != VIR_TRISTATE_SWITCH_ON) break; + virBufferEscapeString(buf, " value='%s'", + def->hyperv_vendor_id); + break; - case VIR_DOMAIN_HYPERV_VENDOR_ID: - if (def->hyperv_features[j] != VIR_TRISTATE_SWITCH_ON) - break; - virBufferEscapeString(buf, " value='%s'", - def->hyperv_vendor_id); - break; + /* coverity[dead_error_begin] */ + case VIR_DOMAIN_HYPERV_LAST: + break; + } - /* coverity[dead_error_begin] */ - case VIR_DOMAIN_HYPERV_LAST: - break; - } + virBufferAddLit(buf, "/>\n"); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</hyperv>\n"); + break; - virBufferAddLit(buf, "/>\n"); - } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</hyperv>\n"); + case VIR_DOMAIN_FEATURE_KVM: + if (def->features[i] != VIR_TRISTATE_SWITCH_ON) break; - case VIR_DOMAIN_FEATURE_KVM: - if (def->features[i] != VIR_TRISTATE_SWITCH_ON) + virBufferAddLit(buf, "<kvm>\n"); + virBufferAdjustIndent(buf, 2); + for (j = 0; j < VIR_DOMAIN_KVM_LAST; j++) { + switch ((virDomainKVM) j) { + case VIR_DOMAIN_KVM_HIDDEN: + if (def->kvm_features[j]) + virBufferAsprintf(buf, "<%s state='%s'/>\n", + virDomainKVMTypeToString(j), + virTristateSwitchTypeToString( + def->kvm_features[j])); break; - virBufferAddLit(buf, "<kvm>\n"); - virBufferAdjustIndent(buf, 2); - for (j = 0; j < VIR_DOMAIN_KVM_LAST; j++) { - switch ((virDomainKVM) j) { - case VIR_DOMAIN_KVM_HIDDEN: - if (def->kvm_features[j]) - virBufferAsprintf(buf, "<%s state='%s'/>\n", - virDomainKVMTypeToString(j), - virTristateSwitchTypeToString( - def->kvm_features[j])); - break; - - /* coverity[dead_error_begin] */ - case VIR_DOMAIN_KVM_LAST: - break; - } - } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</kvm>\n"); - break; - - case VIR_DOMAIN_FEATURE_CAPABILITIES: - if (def->features[i] == VIR_DOMAIN_CAPABILITIES_POLICY_DEFAULT && - !virDomainDefHasCapabilitiesFeatures(def)) { + /* coverity[dead_error_begin] */ + case VIR_DOMAIN_KVM_LAST: break; } + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</kvm>\n"); + break; - virBufferAsprintf(buf, "<capabilities policy='%s'>\n", - virDomainCapabilitiesPolicyTypeToString(def->features[i])); - virBufferAdjustIndent(buf, 2); - for (j = 0; j < VIR_DOMAIN_CAPS_FEATURE_LAST; j++) { - if (def->caps_features[j] != VIR_TRISTATE_SWITCH_ABSENT) - virBufferAsprintf(buf, "<%s state='%s'/>\n", - virDomainCapsFeatureTypeToString(j), - virTristateSwitchTypeToString( - def->caps_features[j])); - } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</capabilities>\n"); + case VIR_DOMAIN_FEATURE_CAPABILITIES: + if (def->features[i] == VIR_DOMAIN_CAPABILITIES_POLICY_DEFAULT && + !virDomainDefHasCapabilitiesFeatures(def)) { break; + } - case VIR_DOMAIN_FEATURE_GIC: - if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { - virBufferAddLit(buf, "<gic"); - if (def->gic_version != VIR_GIC_VERSION_NONE) - virBufferAsprintf(buf, " version='%s'", - virGICVersionTypeToString(def->gic_version)); - virBufferAddLit(buf, "/>\n"); - } - break; + virBufferAsprintf(buf, "<capabilities policy='%s'>\n", + virDomainCapabilitiesPolicyTypeToString(def->features[i])); + virBufferAdjustIndent(buf, 2); + for (j = 0; j < VIR_DOMAIN_CAPS_FEATURE_LAST; j++) { + if (def->caps_features[j] != VIR_TRISTATE_SWITCH_ABSENT) + virBufferAsprintf(buf, "<%s state='%s'/>\n", + virDomainCapsFeatureTypeToString(j), + virTristateSwitchTypeToString( + def->caps_features[j])); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</capabilities>\n"); + break; - case VIR_DOMAIN_FEATURE_IOAPIC: - if (def->features[i] == VIR_DOMAIN_IOAPIC_NONE) - break; + case VIR_DOMAIN_FEATURE_GIC: + if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { + virBufferAddLit(buf, "<gic"); + if (def->gic_version != VIR_GIC_VERSION_NONE) + virBufferAsprintf(buf, " version='%s'", + virGICVersionTypeToString(def->gic_version)); + virBufferAddLit(buf, "/>\n"); + } + break; - virBufferAsprintf(buf, "<ioapic driver='%s'/>\n", - virDomainIOAPICTypeToString(def->features[i])); + case VIR_DOMAIN_FEATURE_IOAPIC: + if (def->features[i] == VIR_DOMAIN_IOAPIC_NONE) break; - case VIR_DOMAIN_FEATURE_HPT: - if (def->features[i] != VIR_TRISTATE_SWITCH_ON) - break; + virBufferAsprintf(buf, "<ioapic driver='%s'/>\n", + virDomainIOAPICTypeToString(def->features[i])); + break; - virBufferFreeAndReset(&attributeBuf); - virBufferFreeAndReset(&childrenBuf); + case VIR_DOMAIN_FEATURE_HPT: + if (def->features[i] != VIR_TRISTATE_SWITCH_ON) + break; - if (def->hpt_resizing != VIR_DOMAIN_HPT_RESIZING_NONE) { - virBufferAsprintf(&attributeBuf, - " resizing='%s'", - virDomainHPTResizingTypeToString(def->hpt_resizing)); - } - if (def->hpt_maxpagesize > 0) { - virBufferSetChildIndent(&childrenBuf, buf); - virBufferAsprintf(&childrenBuf, - "<maxpagesize unit='KiB'>%llu</maxpagesize>\n", - def->hpt_maxpagesize); - } + virBufferFreeAndReset(&attributeBuf); + virBufferFreeAndReset(&childrenBuf); - if (virXMLFormatElement(buf, "hpt", - &attributeBuf, &childrenBuf) < 0) { - goto error; - } - break; + if (def->hpt_resizing != VIR_DOMAIN_HPT_RESIZING_NONE) { + virBufferAsprintf(&attributeBuf, + " resizing='%s'", + virDomainHPTResizingTypeToString(def->hpt_resizing)); + } + if (def->hpt_maxpagesize > 0) { + virBufferSetChildIndent(&childrenBuf, buf); + virBufferAsprintf(&childrenBuf, + "<maxpagesize unit='KiB'>%llu</maxpagesize>\n", + def->hpt_maxpagesize); + } - case VIR_DOMAIN_FEATURE_MSRS: - if (def->features[i] != VIR_TRISTATE_SWITCH_ON) - break; + if (virXMLFormatElement(buf, "hpt", + &attributeBuf, &childrenBuf) < 0) { + goto error; + } + break; - virBufferAsprintf(buf, "<msrs unknown='%s'/>\n", - virDomainMsrsUnknownTypeToString(def->msrs_features[VIR_DOMAIN_MSRS_UNKNOWN])); + case VIR_DOMAIN_FEATURE_MSRS: + if (def->features[i] != VIR_TRISTATE_SWITCH_ON) break; - /* coverity[dead_error_begin] */ - case VIR_DOMAIN_FEATURE_LAST: - break; - } - } + virBufferAsprintf(buf, "<msrs unknown='%s'/>\n", + virDomainMsrsUnknownTypeToString(def->msrs_features[VIR_DOMAIN_MSRS_UNKNOWN])); + break; - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</features>\n"); + /* coverity[dead_error_begin] */ + case VIR_DOMAIN_FEATURE_LAST: + break; + } } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "</features>\n"); + return 0; error: -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:37AM +0100, Peter Krempa wrote:
Use an early return to avoid one level of nesting scopes.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 423 +++++++++++++++++++++-------------------- 1 file changed, 212 insertions(+), 211 deletions(-)
-w --stat 1 file changed, 4 insertions(+), 3 deletions(-) Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

These buffers are used temporarily for some of the partial formatters but not globally. Prefix the name with 'tmp' to be explicit. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 70f3ac4fde..9ed153a71f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27745,8 +27745,8 @@ static int virDomainDefFormatFeatures(virBufferPtr buf, virDomainDefPtr def) { - virBuffer attributeBuf = VIR_BUFFER_INITIALIZER; - virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; + virBuffer tmpAttrBuf = VIR_BUFFER_INITIALIZER; + virBuffer tmpChildBuf = VIR_BUFFER_INITIALIZER; size_t i; for (i = 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { @@ -27979,23 +27979,23 @@ virDomainDefFormatFeatures(virBufferPtr buf, if (def->features[i] != VIR_TRISTATE_SWITCH_ON) break; - virBufferFreeAndReset(&attributeBuf); - virBufferFreeAndReset(&childrenBuf); + virBufferFreeAndReset(&tmpAttrBuf); + virBufferFreeAndReset(&tmpChildBuf); if (def->hpt_resizing != VIR_DOMAIN_HPT_RESIZING_NONE) { - virBufferAsprintf(&attributeBuf, + virBufferAsprintf(&tmpAttrBuf, " resizing='%s'", virDomainHPTResizingTypeToString(def->hpt_resizing)); } if (def->hpt_maxpagesize > 0) { - virBufferSetChildIndent(&childrenBuf, buf); - virBufferAsprintf(&childrenBuf, + virBufferSetChildIndent(&tmpChildBuf, buf); + virBufferAsprintf(&tmpChildBuf, "<maxpagesize unit='KiB'>%llu</maxpagesize>\n", def->hpt_maxpagesize); } if (virXMLFormatElement(buf, "hpt", - &attributeBuf, &childrenBuf) < 0) { + &tmpAttrBuf, &tmpChildBuf) < 0) { goto error; } break; @@ -28020,8 +28020,8 @@ virDomainDefFormatFeatures(virBufferPtr buf, return 0; error: - virBufferFreeAndReset(&attributeBuf); - virBufferFreeAndReset(&childrenBuf); + virBufferFreeAndReset(&tmpAttrBuf); + virBufferFreeAndReset(&tmpChildBuf); return -1; } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:38AM +0100, Peter Krempa wrote:
These buffers are used temporarily for some of the partial formatters but not globally. Prefix the name with 'tmp' to be explicit.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

'i' is always in range of the enum, thus the name is always populated by virDomainFeatureTypeToString. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9ed153a71f..52022aed0b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27765,12 +27765,6 @@ virDomainDefFormatFeatures(virBufferPtr buf, const char *name = virDomainFeatureTypeToString(i); size_t j; - if (!name) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected feature %zu"), i); - goto error; - } - switch ((virDomainFeature) i) { case VIR_DOMAIN_FEATURE_ACPI: case VIR_DOMAIN_FEATURE_PAE: -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:39AM +0100, Peter Krempa wrote:
'i' is always in range of the enum, thus the name is always populated by virDomainFeatureTypeToString.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 6 ------ 1 file changed, 6 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use VIR_AUTOCLEAN to avoid leaking the buffer on error path and get rid of resetting mid loop since virXMLFormatElement does the reset internally. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 52022aed0b..605ae3667b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27745,8 +27745,8 @@ static int virDomainDefFormatFeatures(virBufferPtr buf, virDomainDefPtr def) { - virBuffer tmpAttrBuf = VIR_BUFFER_INITIALIZER; - virBuffer tmpChildBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) tmpAttrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) tmpChildBuf = VIR_BUFFER_INITIALIZER; size_t i; for (i = 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { @@ -27784,8 +27784,7 @@ virDomainDefFormatFeatures(virBufferPtr buf, case VIR_TRISTATE_SWITCH_OFF: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected state of feature '%s'"), name); - - goto error; + return -1; break; } @@ -27835,7 +27834,7 @@ virDomainDefFormatFeatures(virBufferPtr buf, } if (virXMLFormatElement(buf, "smm", &attrBuf, &childBuf) < 0) - goto error; + return -1; } break; @@ -27973,9 +27972,6 @@ virDomainDefFormatFeatures(virBufferPtr buf, if (def->features[i] != VIR_TRISTATE_SWITCH_ON) break; - virBufferFreeAndReset(&tmpAttrBuf); - virBufferFreeAndReset(&tmpChildBuf); - if (def->hpt_resizing != VIR_DOMAIN_HPT_RESIZING_NONE) { virBufferAsprintf(&tmpAttrBuf, " resizing='%s'", @@ -27988,10 +27984,8 @@ virDomainDefFormatFeatures(virBufferPtr buf, def->hpt_maxpagesize); } - if (virXMLFormatElement(buf, "hpt", - &tmpAttrBuf, &tmpChildBuf) < 0) { - goto error; - } + if (virXMLFormatElement(buf, "hpt", &tmpAttrBuf, &tmpChildBuf) < 0) + return -1; break; case VIR_DOMAIN_FEATURE_MSRS: @@ -28012,11 +28006,6 @@ virDomainDefFormatFeatures(virBufferPtr buf, virBufferAddLit(buf, "</features>\n"); return 0; - - error: - virBufferFreeAndReset(&tmpAttrBuf); - virBufferFreeAndReset(&tmpChildBuf); - return -1; } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:40AM +0100, Peter Krempa wrote:
Use VIR_AUTOCLEAN to avoid leaking the buffer on error path and get rid of resetting mid loop since virXMLFormatElement does the reset internally.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use the top level set of temp buffers to do the job. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 605ae3667b..a1ed889e1d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27816,10 +27816,8 @@ virDomainDefFormatFeatures(virBufferPtr buf, case VIR_DOMAIN_FEATURE_SMM: if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT) { virTristateSwitch state = def->features[i]; - virBuffer attrBuf = VIR_BUFFER_INITIALIZER; - virBuffer childBuf = VIR_BUFFER_INITIALIZER; - virBufferAsprintf(&attrBuf, " state='%s'", + virBufferAsprintf(&tmpAttrBuf, " state='%s'", virTristateSwitchTypeToString(state)); if (state == VIR_TRISTATE_SWITCH_ON && @@ -27828,12 +27826,12 @@ virDomainDefFormatFeatures(virBufferPtr buf, unsigned long long short_size = virFormatIntPretty(def->tseg_size, &unit); - virBufferSetChildIndent(&childBuf, buf); - virBufferAsprintf(&childBuf, "<tseg unit='%s'>%llu</tseg>\n", + virBufferSetChildIndent(&tmpChildBuf, buf); + virBufferAsprintf(&tmpChildBuf, "<tseg unit='%s'>%llu</tseg>\n", unit, short_size); } - if (virXMLFormatElement(buf, "smm", &attrBuf, &childBuf) < 0) + if (virXMLFormatElement(buf, "smm", &tmpAttrBuf, &tmpChildBuf) < 0) return -1; } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:41AM +0100, Peter Krempa wrote:
Use the top level set of temp buffers to do the job.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use an early break and remove the temporary variable. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a1ed889e1d..b42c63fb4d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27814,27 +27814,26 @@ virDomainDefFormatFeatures(virBufferPtr buf, break; case VIR_DOMAIN_FEATURE_SMM: - if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT) { - virTristateSwitch state = def->features[i]; - - virBufferAsprintf(&tmpAttrBuf, " state='%s'", - virTristateSwitchTypeToString(state)); + if (def->features[i] == VIR_TRISTATE_SWITCH_ABSENT) + break; - if (state == VIR_TRISTATE_SWITCH_ON && - def->tseg_specified) { - const char *unit; - unsigned long long short_size = virFormatIntPretty(def->tseg_size, - &unit); + virBufferAsprintf(&tmpAttrBuf, " state='%s'", + virTristateSwitchTypeToString(def->features[i])); - virBufferSetChildIndent(&tmpChildBuf, buf); - virBufferAsprintf(&tmpChildBuf, "<tseg unit='%s'>%llu</tseg>\n", - unit, short_size); - } + if (def->features[i] == VIR_TRISTATE_SWITCH_ON && + def->tseg_specified) { + const char *unit; + unsigned long long short_size = virFormatIntPretty(def->tseg_size, + &unit); - if (virXMLFormatElement(buf, "smm", &tmpAttrBuf, &tmpChildBuf) < 0) - return -1; + virBufferSetChildIndent(&tmpChildBuf, buf); + virBufferAsprintf(&tmpChildBuf, "<tseg unit='%s'>%llu</tseg>\n", + unit, short_size); } + if (virXMLFormatElement(buf, "smm", &tmpAttrBuf, &tmpChildBuf) < 0) + return -1; + break; case VIR_DOMAIN_FEATURE_APIC: -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:42AM +0100, Peter Krempa wrote:
Use an early break and remove the temporary variable.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

If none of the 'capabilities' features are enabled we'd still format the opening and closing tag for the <capabilities element. The implementation is suboptimal but will be refactored for a better approach. This is done prior to the refactor to show that tests are not impacted. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 9 ++++++++- tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-cpusettune.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-cputune.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-idmap.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-memtune.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-miscnetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-nonenetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-nonetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-vlannetwork.xml | 3 +-- 12 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b42c63fb4d..90aa02a7ea 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27933,8 +27933,15 @@ virDomainDefFormatFeatures(virBufferPtr buf, break; } - virBufferAsprintf(buf, "<capabilities policy='%s'>\n", + virBufferAsprintf(buf, "<capabilities policy='%s'", virDomainCapabilitiesPolicyTypeToString(def->features[i])); + + if (!virDomainDefHasCapabilitiesFeatures(def)) { + virBufferAddLit(buf, "/>\n"); + break; + } else { + virBufferAddLit(buf, ">\n"); + } virBufferAdjustIndent(buf, 2); for (j = 0; j < VIR_DOMAIN_CAPS_FEATURE_LAST; j++) { if (def->caps_features[j] != VIR_TRISTATE_SWITCH_ABSENT) diff --git a/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml b/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml index 641edb94fa..ab07fb0e80 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml @@ -25,8 +25,7 @@ </os> <features> <privnet/> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-cpusettune.xml b/tests/lxcconf2xmldata/lxcconf2xml-cpusettune.xml index bafaa960f8..6df089d00f 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-cpusettune.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-cpusettune.xml @@ -13,8 +13,7 @@ </os> <features> <privnet/> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-cputune.xml b/tests/lxcconf2xmldata/lxcconf2xml-cputune.xml index f7f8041dd6..359c820a2d 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-cputune.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-cputune.xml @@ -15,8 +15,7 @@ </os> <features> <privnet/> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-idmap.xml b/tests/lxcconf2xmldata/lxcconf2xml-idmap.xml index dd3843d5cb..1efcc131cb 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-idmap.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-idmap.xml @@ -14,8 +14,7 @@ </idmap> <features> <privnet/> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork.xml b/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork.xml index a345e8e019..cced2f25db 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork.xml @@ -9,8 +9,7 @@ <init>/sbin/init</init> </os> <features> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-memtune.xml b/tests/lxcconf2xmldata/lxcconf2xml-memtune.xml index 57e751aaba..24af021e49 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-memtune.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-memtune.xml @@ -15,8 +15,7 @@ </os> <features> <privnet/> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork.xml b/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork.xml index 63189cfaec..9e41e408ee 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork.xml @@ -9,8 +9,7 @@ <init>/sbin/init</init> </os> <features> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-nonenetwork.xml b/tests/lxcconf2xmldata/lxcconf2xml-nonenetwork.xml index 0122ab05c7..1a8e51bb56 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-nonenetwork.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-nonenetwork.xml @@ -9,8 +9,7 @@ <init>/sbin/init</init> </os> <features> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-nonetwork.xml b/tests/lxcconf2xmldata/lxcconf2xml-nonetwork.xml index 04ea280b3c..3c9f4474e5 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-nonetwork.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-nonetwork.xml @@ -10,8 +10,7 @@ </os> <features> <privnet/> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml b/tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml index 4fb3f954e0..fa3cf67fc3 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml @@ -9,8 +9,7 @@ <init>/sbin/init</init> </os> <features> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> diff --git a/tests/lxcconf2xmldata/lxcconf2xml-vlannetwork.xml b/tests/lxcconf2xmldata/lxcconf2xml-vlannetwork.xml index 47ed898b0f..08bea62f7f 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-vlannetwork.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-vlannetwork.xml @@ -9,8 +9,7 @@ <init>/sbin/init</init> </os> <features> - <capabilities policy='allow'> - </capabilities> + <capabilities policy='allow'/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:43AM +0100, Peter Krempa wrote:
If none of the 'capabilities' features are enabled we'd still format the opening and closing tag for the <capabilities element.
The implementation is suboptimal but will be refactored for a better approach. This is done prior to the refactor to show that tests are not impacted.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 9 ++++++++- tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-cpusettune.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-cputune.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-idmap.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-memtune.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-miscnetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-nonenetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-nonetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml | 3 +-- tests/lxcconf2xmldata/lxcconf2xml-vlannetwork.xml | 3 +-- 12 files changed, 19 insertions(+), 23 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Use virXMLFormatElement for the formatting which allows us to avoid looking through the array to see if any feature is enabled. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 90aa02a7ea..beabbace94 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27928,30 +27928,23 @@ virDomainDefFormatFeatures(virBufferPtr buf, break; case VIR_DOMAIN_FEATURE_CAPABILITIES: - if (def->features[i] == VIR_DOMAIN_CAPABILITIES_POLICY_DEFAULT && - !virDomainDefHasCapabilitiesFeatures(def)) { - break; - } + virBufferSetChildIndent(&tmpChildBuf, buf); - virBufferAsprintf(buf, "<capabilities policy='%s'", - virDomainCapabilitiesPolicyTypeToString(def->features[i])); - - if (!virDomainDefHasCapabilitiesFeatures(def)) { - virBufferAddLit(buf, "/>\n"); - break; - } else { - virBufferAddLit(buf, ">\n"); - } - virBufferAdjustIndent(buf, 2); for (j = 0; j < VIR_DOMAIN_CAPS_FEATURE_LAST; j++) { if (def->caps_features[j] != VIR_TRISTATE_SWITCH_ABSENT) - virBufferAsprintf(buf, "<%s state='%s'/>\n", + virBufferAsprintf(&tmpChildBuf, "<%s state='%s'/>\n", virDomainCapsFeatureTypeToString(j), - virTristateSwitchTypeToString( - def->caps_features[j])); + virTristateSwitchTypeToString(def->caps_features[j])); } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</capabilities>\n"); + + /* the 'default' policy should be printed if any capability is present */ + if (def->features[i] != VIR_DOMAIN_CAPABILITIES_POLICY_DEFAULT || + virBufferUse(&tmpChildBuf)) + virBufferAsprintf(&tmpAttrBuf, " policy='%s'", + virDomainCapabilitiesPolicyTypeToString(def->features[i])); + + if (virXMLFormatElement(buf, "capabilities", &tmpAttrBuf, &tmpChildBuf) < 0) + return -1; break; case VIR_DOMAIN_FEATURE_GIC: -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:44AM +0100, Peter Krempa wrote:
Use virXMLFormatElement for the formatting which allows us to avoid looking through the array to see if any feature is enabled.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Remove logic necessary to figure out whether to format the 'features' element by using virXMLFormatElement. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 91 +++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 58 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index beabbace94..f48b41da87 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27150,19 +27150,6 @@ virDomainPerfDefFormat(virBufferPtr buf, virDomainPerfDefPtr perf) virBufferAddLit(buf, "</perf>\n"); } -static bool -virDomainDefHasCapabilitiesFeatures(virDomainDefPtr def) -{ - size_t i; - - for (i = 0; i < VIR_DOMAIN_CAPS_FEATURE_LAST; i++) { - if (def->caps_features[i] != VIR_TRISTATE_SWITCH_ABSENT) - return true; - } - - return false; -} - static void virDomainSchedulerFormat(virBufferPtr buf, @@ -27747,19 +27734,10 @@ virDomainDefFormatFeatures(virBufferPtr buf, { VIR_AUTOCLEAN(virBuffer) tmpAttrBuf = VIR_BUFFER_INITIALIZER; VIR_AUTOCLEAN(virBuffer) tmpChildBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; size_t i; - for (i = 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { - if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT) - break; - } - - if (i == VIR_DOMAIN_FEATURE_LAST && - !virDomainDefHasCapabilitiesFeatures(def)) - return 0; - - virBufferAddLit(buf, "<features>\n"); - virBufferAdjustIndent(buf, 2); + virBufferSetChildIndent(&childBuf, buf); for (i = 0; i < VIR_DOMAIN_FEATURE_LAST; i++) { const char *name = virDomainFeatureTypeToString(i); @@ -27777,7 +27755,7 @@ virDomainDefFormatFeatures(virBufferPtr buf, break; case VIR_TRISTATE_SWITCH_ON: - virBufferAsprintf(buf, "<%s/>\n", name); + virBufferAsprintf(&childBuf, "<%s/>\n", name); break; case VIR_TRISTATE_SWITCH_LAST: @@ -27803,11 +27781,11 @@ virDomainDefFormatFeatures(virBufferPtr buf, break; case VIR_TRISTATE_SWITCH_ON: - virBufferAsprintf(buf, "<%s state='on'/>\n", name); + virBufferAsprintf(&childBuf, "<%s state='on'/>\n", name); break; case VIR_TRISTATE_SWITCH_OFF: - virBufferAsprintf(buf, "<%s state='off'/>\n", name); + virBufferAsprintf(&childBuf, "<%s state='off'/>\n", name); break; } @@ -27826,24 +27804,24 @@ virDomainDefFormatFeatures(virBufferPtr buf, unsigned long long short_size = virFormatIntPretty(def->tseg_size, &unit); - virBufferSetChildIndent(&tmpChildBuf, buf); + virBufferSetChildIndent(&tmpChildBuf, &childBuf); virBufferAsprintf(&tmpChildBuf, "<tseg unit='%s'>%llu</tseg>\n", unit, short_size); } - if (virXMLFormatElement(buf, "smm", &tmpAttrBuf, &tmpChildBuf) < 0) + if (virXMLFormatElement(&childBuf, "smm", &tmpAttrBuf, &tmpChildBuf) < 0) return -1; break; case VIR_DOMAIN_FEATURE_APIC: if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { - virBufferAddLit(buf, "<apic"); + virBufferAddLit(&childBuf, "<apic"); if (def->apic_eoi) { - virBufferAsprintf(buf, " eoi='%s'", + virBufferAsprintf(&childBuf, " eoi='%s'", virTristateSwitchTypeToString(def->apic_eoi)); } - virBufferAddLit(buf, "/>\n"); + virBufferAddLit(&childBuf, "/>\n"); } break; @@ -27851,13 +27829,13 @@ virDomainDefFormatFeatures(virBufferPtr buf, if (def->features[i] != VIR_TRISTATE_SWITCH_ON) break; - virBufferAddLit(buf, "<hyperv>\n"); - virBufferAdjustIndent(buf, 2); + virBufferAddLit(&childBuf, "<hyperv>\n"); + virBufferAdjustIndent(&childBuf, 2); for (j = 0; j < VIR_DOMAIN_HYPERV_LAST; j++) { if (def->hyperv_features[j] == VIR_TRISTATE_SWITCH_ABSENT) continue; - virBufferAsprintf(buf, "<%s state='%s'", + virBufferAsprintf(&childBuf, "<%s state='%s'", virDomainHypervTypeToString(j), virTristateSwitchTypeToString( def->hyperv_features[j])); @@ -27880,14 +27858,14 @@ virDomainDefFormatFeatures(virBufferPtr buf, case VIR_DOMAIN_HYPERV_SPINLOCKS: if (def->hyperv_features[j] != VIR_TRISTATE_SWITCH_ON) break; - virBufferAsprintf(buf, " retries='%d'", + virBufferAsprintf(&childBuf, " retries='%d'", def->hyperv_spinlocks); break; case VIR_DOMAIN_HYPERV_VENDOR_ID: if (def->hyperv_features[j] != VIR_TRISTATE_SWITCH_ON) break; - virBufferEscapeString(buf, " value='%s'", + virBufferEscapeString(&childBuf, " value='%s'", def->hyperv_vendor_id); break; @@ -27896,23 +27874,23 @@ virDomainDefFormatFeatures(virBufferPtr buf, break; } - virBufferAddLit(buf, "/>\n"); + virBufferAddLit(&childBuf, "/>\n"); } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</hyperv>\n"); + virBufferAdjustIndent(&childBuf, -2); + virBufferAddLit(&childBuf, "</hyperv>\n"); break; case VIR_DOMAIN_FEATURE_KVM: if (def->features[i] != VIR_TRISTATE_SWITCH_ON) break; - virBufferAddLit(buf, "<kvm>\n"); - virBufferAdjustIndent(buf, 2); + virBufferAddLit(&childBuf, "<kvm>\n"); + virBufferAdjustIndent(&childBuf, 2); for (j = 0; j < VIR_DOMAIN_KVM_LAST; j++) { switch ((virDomainKVM) j) { case VIR_DOMAIN_KVM_HIDDEN: if (def->kvm_features[j]) - virBufferAsprintf(buf, "<%s state='%s'/>\n", + virBufferAsprintf(&childBuf, "<%s state='%s'/>\n", virDomainKVMTypeToString(j), virTristateSwitchTypeToString( def->kvm_features[j])); @@ -27923,12 +27901,12 @@ virDomainDefFormatFeatures(virBufferPtr buf, break; } } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</kvm>\n"); + virBufferAdjustIndent(&childBuf, -2); + virBufferAddLit(&childBuf, "</kvm>\n"); break; case VIR_DOMAIN_FEATURE_CAPABILITIES: - virBufferSetChildIndent(&tmpChildBuf, buf); + virBufferSetChildIndent(&tmpChildBuf, &childBuf); for (j = 0; j < VIR_DOMAIN_CAPS_FEATURE_LAST; j++) { if (def->caps_features[j] != VIR_TRISTATE_SWITCH_ABSENT) @@ -27943,17 +27921,17 @@ virDomainDefFormatFeatures(virBufferPtr buf, virBufferAsprintf(&tmpAttrBuf, " policy='%s'", virDomainCapabilitiesPolicyTypeToString(def->features[i])); - if (virXMLFormatElement(buf, "capabilities", &tmpAttrBuf, &tmpChildBuf) < 0) + if (virXMLFormatElement(&childBuf, "capabilities", &tmpAttrBuf, &tmpChildBuf) < 0) return -1; break; case VIR_DOMAIN_FEATURE_GIC: if (def->features[i] == VIR_TRISTATE_SWITCH_ON) { - virBufferAddLit(buf, "<gic"); + virBufferAddLit(&childBuf, "<gic"); if (def->gic_version != VIR_GIC_VERSION_NONE) - virBufferAsprintf(buf, " version='%s'", + virBufferAsprintf(&childBuf, " version='%s'", virGICVersionTypeToString(def->gic_version)); - virBufferAddLit(buf, "/>\n"); + virBufferAddLit(&childBuf, "/>\n"); } break; @@ -27961,7 +27939,7 @@ virDomainDefFormatFeatures(virBufferPtr buf, if (def->features[i] == VIR_DOMAIN_IOAPIC_NONE) break; - virBufferAsprintf(buf, "<ioapic driver='%s'/>\n", + virBufferAsprintf(&childBuf, "<ioapic driver='%s'/>\n", virDomainIOAPICTypeToString(def->features[i])); break; @@ -27975,13 +27953,13 @@ virDomainDefFormatFeatures(virBufferPtr buf, virDomainHPTResizingTypeToString(def->hpt_resizing)); } if (def->hpt_maxpagesize > 0) { - virBufferSetChildIndent(&tmpChildBuf, buf); + virBufferSetChildIndent(&tmpChildBuf, &childBuf); virBufferAsprintf(&tmpChildBuf, "<maxpagesize unit='KiB'>%llu</maxpagesize>\n", def->hpt_maxpagesize); } - if (virXMLFormatElement(buf, "hpt", &tmpAttrBuf, &tmpChildBuf) < 0) + if (virXMLFormatElement(&childBuf, "hpt", &tmpAttrBuf, &tmpChildBuf) < 0) return -1; break; @@ -27989,7 +27967,7 @@ virDomainDefFormatFeatures(virBufferPtr buf, if (def->features[i] != VIR_TRISTATE_SWITCH_ON) break; - virBufferAsprintf(buf, "<msrs unknown='%s'/>\n", + virBufferAsprintf(&childBuf, "<msrs unknown='%s'/>\n", virDomainMsrsUnknownTypeToString(def->msrs_features[VIR_DOMAIN_MSRS_UNKNOWN])); break; @@ -27999,10 +27977,7 @@ virDomainDefFormatFeatures(virBufferPtr buf, } } - virBufferAdjustIndent(buf, -2); - virBufferAddLit(buf, "</features>\n"); - - return 0; + return virXMLFormatElement(buf, "features", NULL, &childBuf); } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:45AM +0100, Peter Krempa wrote:
Remove logic necessary to figure out whether to format the 'features' element by using virXMLFormatElement.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 91 +++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 58 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 90 +++++++++++++----------------------------- 1 file changed, 28 insertions(+), 62 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f48b41da87..ea4fbf2280 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -6761,8 +6761,8 @@ virDomainDeviceInfoFormat(virBufferPtr buf, virDomainDeviceInfoPtr info, unsigned int flags) { - virBuffer attrBuf = VIR_BUFFER_INITIALIZER; - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; int ret = -1; if ((flags & VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) && info->bootIndex) { @@ -6910,9 +6910,6 @@ virDomainDeviceInfoFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&attrBuf); - virBufferFreeAndReset(&childBuf); - return ret; } @@ -23738,7 +23735,7 @@ virDomainDiskSourceFormatPrivateData(virBufferPtr buf, unsigned int flags, virDomainXMLOptionPtr xmlopt) { - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; int ret = -1; if (!(flags & VIR_DOMAIN_DEF_FORMAT_STATUS) || @@ -23756,8 +23753,6 @@ virDomainDiskSourceFormatPrivateData(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&childBuf); - return ret; } @@ -23843,8 +23838,8 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf, bool attrIndex, virDomainXMLOptionPtr xmlopt) { - virBuffer attrBuf = VIR_BUFFER_INITIALIZER; - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; int ret = -1; virBufferSetChildIndent(&childBuf, buf); @@ -23869,8 +23864,6 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&attrBuf); - virBufferFreeAndReset(&childBuf); return ret; } @@ -24102,7 +24095,7 @@ virDomainDiskDefFormatPrivateData(virBufferPtr buf, unsigned int flags, virDomainXMLOptionPtr xmlopt) { - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; if (!(flags & VIR_DOMAIN_DEF_FORMAT_STATUS) || !xmlopt || @@ -24112,16 +24105,9 @@ virDomainDiskDefFormatPrivateData(virBufferPtr buf, virBufferSetChildIndent(&childBuf, buf); if (xmlopt->privateData.diskFormat(disk, &childBuf) < 0) - goto error; - - if (virXMLFormatElement(buf, "privateData", NULL, &childBuf) < 0) - goto error; - - return 0; + return -1; - error: - virBufferFreeAndReset(&childBuf); - return -1; + return virXMLFormatElement(buf, "privateData", NULL, &childBuf); } @@ -24259,7 +24245,7 @@ static int virDomainControllerDriverFormat(virBufferPtr buf, virDomainControllerDefPtr def) { - virBuffer driverBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) driverBuf = VIR_BUFFER_INITIALIZER; if (def->queues) virBufferAsprintf(&driverBuf, " queues='%u'", def->queues); @@ -24454,7 +24440,7 @@ virDomainFSDefFormat(virBufferPtr buf, const char *fsdriver = virDomainFSDriverTypeToString(def->fsdriver); const char *wrpolicy = virDomainFSWrpolicyTypeToString(def->wrpolicy); const char *src = def->src->path; - virBuffer driverBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) driverBuf = VIR_BUFFER_INITIALIZER; int ret = -1; if (!type) { @@ -24560,8 +24546,6 @@ virDomainFSDefFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&driverBuf); - return ret; } @@ -25382,8 +25366,8 @@ virDomainChrSourceDefFormat(virBufferPtr buf, virDomainChrSourceDefPtr def, unsigned int flags) { - virBuffer attrBuf = VIR_BUFFER_INITIALIZER; - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; virBufferSetChildIndent(&childBuf, buf); @@ -25499,8 +25483,6 @@ virDomainChrSourceDefFormat(virBufferPtr buf, return 0; error: - virBufferFreeAndReset(&attrBuf); - virBufferFreeAndReset(&childBuf); return -1; } @@ -25669,7 +25651,7 @@ virDomainSmartcardDefFormat(virBufferPtr buf, unsigned int flags) { const char *mode = virDomainSmartcardTypeToString(def->type); - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; size_t i; int ret = -1; @@ -25727,7 +25709,6 @@ virDomainSmartcardDefFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&childBuf); return ret; } @@ -25792,7 +25773,7 @@ virDomainSoundDefFormat(virBufferPtr buf, unsigned int flags) { const char *model = virDomainSoundModelTypeToString(def->model); - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; size_t i; int ret = -1; @@ -25825,8 +25806,6 @@ virDomainSoundDefFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&childBuf); - return ret; } @@ -26175,7 +26154,7 @@ virDomainVideoDefFormat(virBufferPtr buf, unsigned int flags) { const char *model = virDomainVideoTypeToString(def->type); - virBuffer driverBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) driverBuf = VIR_BUFFER_INITIALIZER; int ret = -1; if (!model) { @@ -26232,8 +26211,6 @@ virDomainVideoDefFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&driverBuf); - return ret; } @@ -27236,7 +27213,7 @@ virDomainCachetuneDefFormat(virBufferPtr buf, virDomainResctrlDefPtr resctrl, unsigned int flags) { - virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childrenBuf = VIR_BUFFER_INITIALIZER; size_t i = 0; int ret = -1; VIR_AUTOFREE(char *) vcpus = NULL; @@ -27282,7 +27259,6 @@ virDomainCachetuneDefFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&childrenBuf); return ret; } @@ -27306,7 +27282,7 @@ virDomainMemorytuneDefFormat(virBufferPtr buf, virDomainResctrlDefPtr resctrl, unsigned int flags) { - virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childrenBuf = VIR_BUFFER_INITIALIZER; int ret = -1; VIR_AUTOFREE(char *) vcpus = NULL; @@ -27344,7 +27320,6 @@ virDomainMemorytuneDefFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&childrenBuf); return ret; } @@ -27354,7 +27329,7 @@ virDomainCputuneDefFormat(virBufferPtr buf, unsigned int flags) { size_t i; - virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childrenBuf = VIR_BUFFER_INITIALIZER; int ret = -1; virBufferSetChildIndent(&childrenBuf, buf); @@ -27468,7 +27443,6 @@ virDomainCputuneDefFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&childrenBuf); return ret; } @@ -27537,9 +27511,9 @@ static int virDomainIOMMUDefFormat(virBufferPtr buf, const virDomainIOMMUDef *iommu) { - virBuffer childBuf = VIR_BUFFER_INITIALIZER; - virBuffer attrBuf = VIR_BUFFER_INITIALIZER; - virBuffer driverAttrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) driverAttrBuf = VIR_BUFFER_INITIALIZER; int ret = -1; virBufferSetChildIndent(&childBuf, buf); @@ -27573,8 +27547,6 @@ virDomainIOMMUDefFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&childBuf); - virBufferFreeAndReset(&driverAttrBuf); return ret; } @@ -27583,7 +27555,7 @@ static int virDomainMemtuneFormat(virBufferPtr buf, const virDomainMemtune *mem) { - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; int ret = -1; virBufferSetChildIndent(&childBuf, buf); @@ -27637,7 +27609,6 @@ virDomainMemtuneFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&childBuf); return ret; } @@ -27646,9 +27617,9 @@ static int virDomainVsockDefFormat(virBufferPtr buf, virDomainVsockDefPtr vsock) { - virBuffer childBuf = VIR_BUFFER_INITIALIZER; - virBuffer attrBuf = VIR_BUFFER_INITIALIZER; - virBuffer cidAttrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) cidAttrBuf = VIR_BUFFER_INITIALIZER; int ret = -1; if (vsock->model) { @@ -27676,9 +27647,6 @@ virDomainVsockDefFormat(virBufferPtr buf, ret = 0; cleanup: - virBufferFreeAndReset(&childBuf); - virBufferFreeAndReset(&attrBuf); - virBufferFreeAndReset(&cidAttrBuf); return ret; } @@ -28544,7 +28512,7 @@ virDomainObjFormat(virDomainXMLOptionPtr xmlopt, virCapsPtr caps, unsigned int flags) { - virBuffer buf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) buf = VIR_BUFFER_INITIALIZER; int state; int reason; size_t i; @@ -28578,7 +28546,6 @@ virDomainObjFormat(virDomainXMLOptionPtr xmlopt, return virBufferContentAndReset(&buf); error: - virBufferFreeAndReset(&buf); return NULL; } @@ -29530,7 +29497,7 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, virCapsPtr caps, virDomainXMLOptionPtr xmlopt) { - virBuffer buf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) buf = VIR_BUFFER_INITIALIZER; int flags = VIR_DOMAIN_DEF_FORMAT_INACTIVE | VIR_DOMAIN_DEF_FORMAT_SECURE; int rc = -1; char *netprefix; @@ -30005,7 +29972,7 @@ virDomainGetBlkioParametersAssignFromDef(virDomainDefPtr def, int *nparams, int maxparams) { - virBuffer buf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) buf = VIR_BUFFER_INITIALIZER; char *data = NULL; size_t i; @@ -30045,7 +30012,6 @@ virDomainGetBlkioParametersAssignFromDef(virDomainDefPtr def, error: VIR_FREE(data); - virBufferFreeAndReset(&buf); return -1; } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:46AM +0100, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 90 +++++++++++++----------------------------- 1 file changed, 28 insertions(+), 62 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f48b41da87..ea4fbf2280 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -24102,7 +24095,7 @@ virDomainDiskDefFormatPrivateData(virBufferPtr buf, unsigned int flags, virDomainXMLOptionPtr xmlopt) { - virBuffer childBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) childBuf = VIR_BUFFER_INITIALIZER;
if (!(flags & VIR_DOMAIN_DEF_FORMAT_STATUS) || !xmlopt || @@ -24112,16 +24105,9 @@ virDomainDiskDefFormatPrivateData(virBufferPtr buf, virBufferSetChildIndent(&childBuf, buf);
if (xmlopt->privateData.diskFormat(disk, &childBuf) < 0) - goto error; - - if (virXMLFormatElement(buf, "privateData", NULL, &childBuf) < 0) - goto error; - - return 0; + return -1;
- error: - virBufferFreeAndReset(&childBuf); - return -1; + return virXMLFormatElement(buf, "privateData", NULL, &childBuf); }
You could have left the error: label here, save the cleanups for a separate patch (maybe after we've VIR_AUTOMATIZED all the things!)
@@ -24259,7 +24245,7 @@ static int virDomainControllerDriverFormat(virBufferPtr buf, virDomainControllerDefPtr def) { - virBuffer driverBuf = VIR_BUFFER_INITIALIZER; + VIR_AUTOCLEAN(virBuffer) driverBuf = VIR_BUFFER_INITIALIZER;
if (def->queues) virBufferAsprintf(&driverBuf, " queues='%u'", def->queues);
Technically not needed, but given our tendency to initialize variables even when not necessary, this makes perfect sense. Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Rather than moving the XPath root node in the caller and then still passing it down, make sure that the callees move the node themselves. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 45 ++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ea4fbf2280..bbeb1c1a8d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -14606,9 +14606,12 @@ virSysinfoBIOSParseXML(xmlNodePtr node, xmlXPathContextPtr ctxt, virSysinfoBIOSDefPtr *bios) { + VIR_XPATH_NODE_AUTORESTORE(ctxt); int ret = -1; virSysinfoBIOSDefPtr def; + ctxt->node = node; + if (!virXMLNodeNameEqual(node, "bios")) { virReportError(VIR_ERR_XML_ERROR, "%s", _("XML does not contain expected 'bios' element")); @@ -14666,10 +14669,13 @@ virSysinfoSystemParseXML(xmlNodePtr node, unsigned char *domUUID, bool uuid_generated) { + VIR_XPATH_NODE_AUTORESTORE(ctxt); int ret = -1; virSysinfoSystemDefPtr def; VIR_AUTOFREE(char *) tmpUUID = NULL; + ctxt->node = node; + if (!virXMLNodeNameEqual(node, "system")) { virReportError(VIR_ERR_XML_ERROR, "%s", _("XML does not contain expected 'system' element")); @@ -14786,15 +14792,19 @@ virSysinfoBaseBoardParseXML(xmlXPathContextPtr ctxt, static int -virSysinfoOEMStringsParseXML(xmlXPathContextPtr ctxt, +virSysinfoOEMStringsParseXML(xmlNodePtr node, + xmlXPathContextPtr ctxt, virSysinfoOEMStringsDefPtr *oem) { + VIR_XPATH_NODE_AUTORESTORE(ctxt); int ret = -1; virSysinfoOEMStringsDefPtr def; int nstrings; size_t i; VIR_AUTOFREE(xmlNodePtr *) strings = NULL; + ctxt->node = node; + nstrings = virXPathNodeSet("./entry", ctxt, &strings); if (nstrings < 0) return -1; @@ -14824,9 +14834,12 @@ virSysinfoChassisParseXML(xmlNodePtr node, xmlXPathContextPtr ctxt, virSysinfoChassisDefPtr *chassisdef) { + VIR_XPATH_NODE_AUTORESTORE(ctxt); int ret = -1; virSysinfoChassisDefPtr def; + ctxt->node = node; + if (!xmlStrEqual(node->name, BAD_CAST "chassis")) { virReportError(VIR_ERR_XML_ERROR, "%s", _("XML does not contain expected 'chassis' element")); @@ -14868,7 +14881,7 @@ virSysinfoParseXML(xmlNodePtr node, bool uuid_generated) { virSysinfoDefPtr def; - xmlNodePtr oldnode, tmpnode; + xmlNodePtr tmpnode; VIR_AUTOFREE(char *) type = NULL; if (!virXMLNodeNameEqual(node, "sysinfo")) { @@ -14894,25 +14907,15 @@ virSysinfoParseXML(xmlNodePtr node, /* Extract BIOS related metadata */ if ((tmpnode = virXPathNode("./bios[1]", ctxt)) != NULL) { - oldnode = ctxt->node; - ctxt->node = tmpnode; - if (virSysinfoBIOSParseXML(tmpnode, ctxt, &def->bios) < 0) { - ctxt->node = oldnode; + if (virSysinfoBIOSParseXML(tmpnode, ctxt, &def->bios) < 0) goto error; - } - ctxt->node = oldnode; } /* Extract system related metadata */ if ((tmpnode = virXPathNode("./system[1]", ctxt)) != NULL) { - oldnode = ctxt->node; - ctxt->node = tmpnode; if (virSysinfoSystemParseXML(tmpnode, ctxt, &def->system, - domUUID, uuid_generated) < 0) { - ctxt->node = oldnode; + domUUID, uuid_generated) < 0) goto error; - } - ctxt->node = oldnode; } /* Extract system base board metadata */ @@ -14921,24 +14924,14 @@ virSysinfoParseXML(xmlNodePtr node, /* Extract chassis related metadata */ if ((tmpnode = virXPathNode("./chassis[1]", ctxt)) != NULL) { - oldnode = ctxt->node; - ctxt->node = tmpnode; - if (virSysinfoChassisParseXML(tmpnode, ctxt, &def->chassis) < 0) { - ctxt->node = oldnode; + if (virSysinfoChassisParseXML(tmpnode, ctxt, &def->chassis) < 0) goto error; - } - ctxt->node = oldnode; } /* Extract system related metadata */ if ((tmpnode = virXPathNode("./oemStrings[1]", ctxt)) != NULL) { - oldnode = ctxt->node; - ctxt->node = tmpnode; - if (virSysinfoOEMStringsParseXML(ctxt, &def->oemStrings) < 0) { - ctxt->node = oldnode; + if (virSysinfoOEMStringsParseXML(tmpnode, ctxt, &def->oemStrings) < 0) goto error; - } - ctxt->node = oldnode; } cleanup: -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:47AM +0100, Peter Krempa wrote:
Rather than moving the XPath root node in the caller and then still passing it down, make sure that the callees move the node themselves.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 45 ++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 26 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 131 +++++++++++++---------------------------- 1 file changed, 42 insertions(+), 89 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bbeb1c1a8d..eb660f5764 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8109,11 +8109,10 @@ virDomainNetDefCoalesceParseXML(xmlNodePtr node, xmlXPathContextPtr ctxt) { virNetDevCoalescePtr ret = NULL; - xmlNodePtr save = NULL; + VIR_XPATH_NODE_AUTORESTORE(ctxt); unsigned long long tmp = 0; VIR_AUTOFREE(char *) str = NULL; - save = ctxt->node; ctxt->node = node; str = virXPathString("string(./rx/frames/@max)", ctxt); @@ -8140,7 +8139,6 @@ virDomainNetDefCoalesceParseXML(xmlNodePtr node, ret->rx_max_coalesced_frames = tmp; cleanup: - ctxt->node = save; return ret; error: @@ -8512,16 +8510,15 @@ virSecurityLabelDefsParseXML(virDomainDefPtr def, virCapsPtr caps, unsigned int flags) { + VIR_XPATH_NODE_AUTORESTORE(ctxt); size_t i = 0, j; int n; - xmlNodePtr saved_node; virCapsHostPtr host = &caps->host; VIR_AUTOFREE(xmlNodePtr *) list = NULL; /* Check args and save context */ if (def == NULL || ctxt == NULL) return 0; - saved_node = ctxt->node; /* Allocate a security labels based on XML */ if ((n = virXPathNodeSet("./seclabel", ctxt, &list)) < 0) @@ -8553,7 +8550,6 @@ virSecurityLabelDefsParseXML(virDomainDefPtr def, def->seclabels[i] = seclabel; } def->nseclabels = n; - ctxt->node = saved_node; /* libvirt versions prior to 0.10.0 support just a single seclabel element * in guest's XML and model attribute can be suppressed if type is none or @@ -8603,7 +8599,6 @@ virSecurityLabelDefsParseXML(virDomainDefPtr def, return 0; error: - ctxt->node = saved_node; for (; i > 0; i--) virSecurityLabelDefFree(def->seclabels[i - 1]); VIR_FREE(def->seclabels); @@ -8940,7 +8935,7 @@ virDomainDiskSourcePrivateDataParse(xmlNodePtr node, unsigned int flags, virDomainXMLOptionPtr xmlopt) { - xmlNodePtr saveNode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); int ret = -1; if (!(flags & VIR_DOMAIN_DEF_PARSE_STATUS) || @@ -8960,8 +8955,6 @@ virDomainDiskSourcePrivateDataParse(xmlNodePtr node, ret = 0; cleanup: - ctxt->node = saveNode; - return ret; } @@ -8971,7 +8964,7 @@ virDomainDiskSourcePRParse(xmlNodePtr node, xmlXPathContextPtr ctxt, virStoragePRDefPtr *pr) { - xmlNodePtr saveNode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); int ret = -1; ctxt->node = node; @@ -8986,7 +8979,6 @@ virDomainDiskSourcePRParse(xmlNodePtr node, ret = 0; cleanup: - ctxt->node = saveNode; return ret; } @@ -8998,7 +8990,7 @@ virDomainStorageSourceParse(xmlNodePtr node, unsigned int flags) { int ret = -1; - xmlNodePtr saveNode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr tmp; ctxt->node = node; @@ -9053,7 +9045,6 @@ virDomainStorageSourceParse(xmlNodePtr node, ret = 0; cleanup: - ctxt->node = saveNode; return ret; } @@ -9081,7 +9072,7 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt, unsigned int flags, virDomainXMLOptionPtr xmlopt) { - xmlNodePtr save_ctxt = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr source; int ret = -1; VIR_AUTOUNREF(virStorageSourcePtr) backingStore = NULL; @@ -9148,7 +9139,6 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt, ret = 0; cleanup: - ctxt->node = save_ctxt; return ret; } @@ -9627,7 +9617,7 @@ virDomainDiskDefParsePrivateData(xmlXPathContextPtr ctxt, virDomainXMLOptionPtr xmlopt) { xmlNodePtr private_node = virXPathNode("./privateData", ctxt); - xmlNodePtr save_node = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); int ret = -1; if (!xmlopt || @@ -9643,7 +9633,6 @@ virDomainDiskDefParsePrivateData(xmlXPathContextPtr ctxt, ret = 0; cleanup: - ctxt->node = save_node; return ret; } @@ -9664,7 +9653,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, { virDomainDiskDefPtr def; xmlNodePtr cur; - xmlNodePtr save_ctxt = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); bool source = false; virStorageEncryptionPtr encryption = NULL; VIR_AUTOPTR(virStorageAuthDef) authdef = NULL; @@ -10081,7 +10070,6 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, cleanup: virStorageEncryptionFree(encryption); - ctxt->node = save_ctxt; return def; error: @@ -10367,7 +10355,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt, bool processedTarget = false; int numaNode = -1; int ports = -1; - xmlNodePtr saved = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); int rc; VIR_AUTOFREE(char *) typeStr = NULL; VIR_AUTOFREE(char *) idx = NULL; @@ -10695,7 +10683,6 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt, } cleanup: - ctxt->node = saved; return def; error: @@ -10722,8 +10709,9 @@ virDomainFSDefParseXML(virDomainXMLOptionPtr xmlopt, xmlXPathContextPtr ctxt, unsigned int flags) { + VIR_XPATH_NODE_AUTORESTORE(ctxt); virDomainFSDefPtr def; - xmlNodePtr cur, save_node = ctxt->node; + xmlNodePtr cur; VIR_AUTOFREE(char *) type = NULL; VIR_AUTOFREE(char *) fsdriver = NULL; VIR_AUTOFREE(char *) source = NULL; @@ -10888,7 +10876,6 @@ virDomainFSDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; cleanup: - ctxt->node = save_node; return def; error: @@ -10906,7 +10893,7 @@ virDomainActualNetDefParseXML(xmlNodePtr node, { virDomainActualNetDefPtr actual = NULL; int ret = -1; - xmlNodePtr save_ctxt = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr bandwidth_node = NULL; xmlNodePtr vlanNode; xmlNodePtr virtPortNode; @@ -11066,7 +11053,6 @@ virDomainActualNetDefParseXML(xmlNodePtr node, error: virDomainActualNetDefFree(actual); - ctxt->node = save_ctxt; return ret; } @@ -11106,7 +11092,7 @@ virDomainChrSourceReconnectDefParseXML(virDomainChrSourceReconnectDefPtr def, { int ret = -1; int tmpVal; - xmlNodePtr saveNode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr cur; VIR_AUTOFREE(char *) tmp = NULL; @@ -11143,7 +11129,6 @@ virDomainChrSourceReconnectDefParseXML(virDomainChrSourceReconnectDefPtr def, ret = 0; cleanup: - ctxt->node = saveNode; return ret; } @@ -11165,7 +11150,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, xmlNodePtr tmpNode; virHashTablePtr filterparams = NULL; virDomainActualNetDefPtr actual = NULL; - xmlNodePtr oldnode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); virDomainChrSourceReconnectDef reconnect = {0}; int rv, val; VIR_AUTOFREE(char *) macaddr = NULL; @@ -11949,7 +11934,6 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, } cleanup: - ctxt->node = oldnode; virDomainActualNetDefFree(actual); virHashFree(filterparams); return def; @@ -12829,7 +12813,7 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt, unsigned int flags) { virDomainTPMDefPtr def; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); int nbackends; VIR_AUTOFREE(char *) path = NULL; VIR_AUTOFREE(char *) model = NULL; @@ -12908,7 +12892,6 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; cleanup: - ctxt->node = save; return def; error: @@ -12957,7 +12940,7 @@ virDomainInputDefParseXML(virDomainXMLOptionPtr xmlopt, xmlXPathContextPtr ctxt, unsigned int flags) { - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); virDomainInputDefPtr def; VIR_AUTOFREE(char *) evdev = NULL; VIR_AUTOFREE(char *) type = NULL; @@ -13099,7 +13082,6 @@ virDomainInputDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; cleanup: - ctxt->node = save; return def; error: @@ -13154,7 +13136,7 @@ virDomainTimerDefParseXML(xmlNodePtr node, xmlXPathContextPtr ctxt) { virDomainTimerDefPtr def; - xmlNodePtr oldnode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr catchup; int ret; VIR_AUTOFREE(char *) name = NULL; @@ -13264,8 +13246,6 @@ virDomainTimerDefParseXML(xmlNodePtr node, } cleanup: - ctxt->node = oldnode; - return def; error: @@ -13508,7 +13488,7 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def, xmlXPathContextPtr ctxt, unsigned int flags) { - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); virDomainGraphicsListenDef newListen = {0}; int nListens; int ret = -1; @@ -13579,7 +13559,6 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def, ret = 0; cleanup: virDomainGraphicsListenDefClear(&newListen); - ctxt->node = save; return ret; } @@ -13668,7 +13647,7 @@ virDomainGraphicsDefParseXMLSDL(virDomainGraphicsDefPtr def, xmlNodePtr node, xmlXPathContextPtr ctxt) { - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); int enableVal; xmlNodePtr glNode; int ret = -1; @@ -13714,7 +13693,6 @@ virDomainGraphicsDefParseXMLSDL(virDomainGraphicsDefPtr def, ret = 0; cleanup: - ctxt->node = save; return ret; } @@ -14069,7 +14047,7 @@ virDomainGraphicsDefParseXMLEGLHeadless(virDomainGraphicsDefPtr def, xmlNodePtr node, xmlXPathContextPtr ctxt) { - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr glNode; ctxt->node = node; @@ -14077,7 +14055,6 @@ virDomainGraphicsDefParseXMLEGLHeadless(virDomainGraphicsDefPtr def, if ((glNode = virXPathNode("./gl", ctxt))) def->data.egl_headless.rendernode = virXMLPropString(glNode, "rendernode"); - ctxt->node = save; return 0; } @@ -14200,7 +14177,7 @@ virDomainSoundDefParseXML(virDomainXMLOptionPtr xmlopt, unsigned int flags) { virDomainSoundDefPtr def; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); VIR_AUTOFREE(char *) model = NULL; if (VIR_ALLOC(def) < 0) @@ -14246,7 +14223,6 @@ virDomainSoundDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; cleanup: - ctxt->node = save; return def; error: @@ -14313,7 +14289,7 @@ virDomainRNGDefParseXML(virDomainXMLOptionPtr xmlopt, unsigned int flags) { virDomainRNGDefPtr def; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); int nbackends; VIR_AUTOFREE(xmlNodePtr *) backends = NULL; VIR_AUTOFREE(char *) model = NULL; @@ -14410,7 +14386,6 @@ virDomainRNGDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; cleanup: - ctxt->node = save; return def; error: @@ -14427,7 +14402,7 @@ virDomainMemballoonDefParseXML(virDomainXMLOptionPtr xmlopt, unsigned int flags) { virDomainMemballoonDefPtr def; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); unsigned int period = 0; VIR_AUTOFREE(char *) model = NULL; VIR_AUTOFREE(char *) deflate = NULL; @@ -14477,7 +14452,6 @@ virDomainMemballoonDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; cleanup: - ctxt->node = save; return def; error: @@ -14515,7 +14489,7 @@ virDomainShmemDefParseXML(virDomainXMLOptionPtr xmlopt, virDomainShmemDefPtr def = NULL; virDomainShmemDefPtr ret = NULL; xmlNodePtr msi = NULL; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr server = NULL; VIR_AUTOFREE(char *) tmp = NULL; @@ -14596,7 +14570,6 @@ virDomainShmemDefParseXML(virDomainXMLOptionPtr xmlopt, VIR_STEAL_PTR(ret, def); cleanup: - ctxt->node = save; virDomainShmemDefFree(def); return ret; } @@ -14745,7 +14718,7 @@ virSysinfoBaseBoardParseXML(xmlXPathContextPtr ctxt, { int ret = -1; size_t i, nboards = 0; - xmlNodePtr oldnode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); int n; VIR_AUTOFREE(virSysinfoBaseBoardDefPtr) boards = NULL; VIR_AUTOFREE(xmlNodePtr *) nodes = NULL; @@ -14786,7 +14759,6 @@ virSysinfoBaseBoardParseXML(xmlXPathContextPtr ctxt, *nbaseBoard = nboards; ret = 0; cleanup: - ctxt->node = oldnode; return ret; } @@ -15117,7 +15089,7 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt, { virDomainVideoDefPtr def; xmlNodePtr cur; - xmlNodePtr saved = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); VIR_AUTOFREE(char *) type = NULL; VIR_AUTOFREE(char *) heads = NULL; VIR_AUTOFREE(char *) vram = NULL; @@ -15230,7 +15202,6 @@ virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt, def->driver = virDomainVideoDriverDefParseXML(node); cleanup: - ctxt->node = saved; return def; error: @@ -15246,7 +15217,7 @@ virDomainHostdevDefParseXML(virDomainXMLOptionPtr xmlopt, unsigned int flags) { virDomainHostdevDefPtr def; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); VIR_AUTOFREE(char *) mode = virXMLPropString(node, "mode"); VIR_AUTOFREE(char *) type = virXMLPropString(node, "type"); @@ -15307,7 +15278,6 @@ virDomainHostdevDefParseXML(virDomainXMLOptionPtr xmlopt, } cleanup: - ctxt->node = save; return def; error: @@ -15522,7 +15492,7 @@ virDomainRedirFilterDefParseXML(xmlNodePtr node, { int n; size_t i; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); virDomainRedirFilterDefPtr def = NULL; VIR_AUTOFREE(xmlNodePtr *) nodes = NULL; @@ -15545,7 +15515,6 @@ virDomainRedirFilterDefParseXML(xmlNodePtr node, def->usbdevs[def->nusbdevs++] = usbdev; } - ctxt->node = save; return def; error: @@ -15662,7 +15631,7 @@ virDomainMemorySourceDefParseXML(xmlNodePtr node, virDomainMemoryDefPtr def) { int ret = -1; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); ctxt->node = node; VIR_AUTOFREE(char *) nodemask = NULL; @@ -15709,7 +15678,6 @@ virDomainMemorySourceDefParseXML(xmlNodePtr node, ret = 0; cleanup: - ctxt->node = save; return ret; } @@ -15720,7 +15688,7 @@ virDomainMemoryTargetDefParseXML(xmlNodePtr node, virDomainMemoryDefPtr def) { int ret = -1; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); ctxt->node = node; int rv; @@ -15762,7 +15730,6 @@ virDomainMemoryTargetDefParseXML(xmlNodePtr node, ret = 0; cleanup: - ctxt->node = save; return ret; } @@ -15771,7 +15738,7 @@ static virDomainSEVDefPtr virDomainSEVDefParseXML(xmlNodePtr sevNode, xmlXPathContextPtr ctxt) { - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); virDomainSEVDefPtr def; unsigned long policy; VIR_AUTOFREE(char *) type = NULL; @@ -15824,7 +15791,6 @@ virDomainSEVDefParseXML(xmlNodePtr sevNode, def->session = virXPathString("string(./session)", ctxt); cleanup: - ctxt->node = save; return def; error: @@ -15839,7 +15805,7 @@ virDomainMemoryDefParseXML(virDomainXMLOptionPtr xmlopt, xmlXPathContextPtr ctxt, unsigned int flags) { - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr node; virDomainMemoryDefPtr def; int val; @@ -15903,12 +15869,10 @@ virDomainMemoryDefParseXML(virDomainXMLOptionPtr xmlopt, &def->info, flags) < 0) goto error; - ctxt->node = save; return def; error: virDomainMemoryDefFree(def); - ctxt->node = save; return NULL; } @@ -15918,7 +15882,7 @@ virDomainIOMMUDefParseXML(xmlNodePtr node, xmlXPathContextPtr ctxt) { virDomainIOMMUDefPtr ret = NULL; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr driver; int val; VIR_AUTOFREE(char *) tmp = NULL; @@ -15982,7 +15946,6 @@ virDomainIOMMUDefParseXML(xmlNodePtr node, VIR_STEAL_PTR(ret, iommu); cleanup: - ctxt->node = save; return ret; } @@ -15994,7 +15957,7 @@ virDomainVsockDefParseXML(virDomainXMLOptionPtr xmlopt, unsigned int flags) { virDomainVsockDefPtr ret = NULL; - xmlNodePtr save = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); xmlNodePtr cid; int val; VIR_AUTOFREE(char *) tmp = NULL; @@ -16046,7 +16009,6 @@ virDomainVsockDefParseXML(virDomainXMLOptionPtr xmlopt, VIR_STEAL_PTR(ret, vsock); cleanup: - ctxt->node = save; return ret; } @@ -17770,7 +17732,7 @@ virDomainIdmapDefParseXML(xmlXPathContextPtr ctxt, { size_t i; virDomainIdMapEntryPtr idmap = NULL; - xmlNodePtr save_ctxt = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); if (VIR_ALLOC_N(idmap, num) < 0) goto cleanup; @@ -17799,7 +17761,6 @@ virDomainIdmapDefParseXML(xmlXPathContextPtr ctxt, } cleanup: - ctxt->node = save_ctxt; return idmap; } @@ -18175,7 +18136,7 @@ virDomainHugepagesParseXML(xmlNodePtr node, virDomainHugePagePtr hugepage) { int ret = -1; - xmlNodePtr oldnode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); VIR_AUTOFREE(char *) nodeset = NULL; ctxt->node = node; @@ -18204,7 +18165,6 @@ virDomainHugepagesParseXML(xmlNodePtr node, ret = 0; cleanup: - ctxt->node = oldnode; return ret; } @@ -18213,8 +18173,8 @@ static virDomainResourceDefPtr virDomainResourceDefParse(xmlNodePtr node, xmlXPathContextPtr ctxt) { + VIR_XPATH_NODE_AUTORESTORE(ctxt); virDomainResourceDefPtr def = NULL; - xmlNodePtr tmp = ctxt->node; ctxt->node = node; @@ -18228,11 +18188,9 @@ virDomainResourceDefParse(xmlNodePtr node, goto error; } - ctxt->node = tmp; return def; error: - ctxt->node = tmp; virDomainResourceDefFree(def); return NULL; } @@ -18797,7 +18755,7 @@ virDomainCachetuneDefParseCache(xmlXPathContextPtr ctxt, xmlNodePtr node, virResctrlAllocPtr alloc) { - xmlNodePtr oldnode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); unsigned int level; unsigned int cache; int type; @@ -18859,7 +18817,6 @@ virDomainCachetuneDefParseCache(xmlXPathContextPtr ctxt, ret = 0; cleanup: - ctxt->node = oldnode; return ret; } @@ -18931,7 +18888,7 @@ virDomainResctrlMonDefParse(virDomainDefPtr def, virDomainResctrlDefPtr resctrl) { virDomainResctrlMonDefPtr domresmon = NULL; - xmlNodePtr oldnode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); unsigned int level = 0; size_t i = 0; int n = 0; @@ -19026,7 +18983,6 @@ virDomainResctrlMonDefParse(virDomainDefPtr def, ret = 0; cleanup: - ctxt->node = oldnode; virDomainResctrlMonDefFree(domresmon); return ret; } @@ -19089,7 +19045,7 @@ virDomainCachetuneDefParse(virDomainDefPtr def, xmlNodePtr node, unsigned int flags) { - xmlNodePtr oldnode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); virDomainResctrlDefPtr resctrl = NULL; ssize_t i = 0; int n; @@ -19153,7 +19109,6 @@ virDomainCachetuneDefParse(virDomainDefPtr def, ret = 0; cleanup: - ctxt->node = oldnode; virDomainResctrlDefFree(resctrl); return ret; } @@ -19246,7 +19201,7 @@ virDomainMemorytuneDefParseMemory(xmlXPathContextPtr ctxt, xmlNodePtr node, virResctrlAllocPtr alloc) { - xmlNodePtr oldnode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); unsigned int id; unsigned int bandwidth; int ret = -1; @@ -19285,7 +19240,6 @@ virDomainMemorytuneDefParseMemory(xmlXPathContextPtr ctxt, ret = 0; cleanup: - ctxt->node = oldnode; return ret; } @@ -19296,7 +19250,7 @@ virDomainMemorytuneDefParse(virDomainDefPtr def, xmlNodePtr node, unsigned int flags) { - xmlNodePtr oldnode = ctxt->node; + VIR_XPATH_NODE_AUTORESTORE(ctxt); virDomainResctrlDefPtr resctrl = NULL; VIR_AUTOPTR(virBitmap) vcpus = NULL; VIR_AUTOFREE(xmlNodePtr *) nodes = NULL; @@ -19356,7 +19310,6 @@ virDomainMemorytuneDefParse(virDomainDefPtr def, ret = 0; cleanup: - ctxt->node = oldnode; virDomainResctrlDefFree(resctrl); return ret; } -- 2.20.1

On Wed, Mar 06, 2019 at 09:20:48AM +0100, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 131 +++++++++++++---------------------------- 1 file changed, 42 insertions(+), 89 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Peter Krempa