This allows it to be used by the VIR_*_ELEMENT macros.
Also use them for parsing the definiton and remove the redundant
freeing of 'nodeset' before jumping to the cleanup label.
---
src/conf/storage_conf.c | 23 ++++++++++-------------
src/conf/storage_conf.h | 2 +-
2 files changed, 11 insertions(+), 14 deletions(-)
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 9c2962f..39fb416 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -642,23 +642,20 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
if (nsource < 0)
goto cleanup;
- if (nsource > 0) {
- if (VIR_ALLOC_N(source->devices, nsource) < 0) {
- VIR_FREE(nodeset);
+ for (i = 0; i < nsource; i++) {
+ virStoragePoolSourceDevice dev = { .path = NULL };
+ dev.path = virXMLPropString(nodeset[i], "path");
+
+ if (dev.path == NULL) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("missing storage pool source device path"));
goto cleanup;
}
- for (i = 0; i < nsource; i++) {
- char *path = virXMLPropString(nodeset[i], "path");
- if (path == NULL) {
- VIR_FREE(nodeset);
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("missing storage pool source device path"));
- goto cleanup;
- }
- source->devices[i].path = path;
+ if (VIR_APPEND_ELEMENT(source->devices, source->ndevice, dev) < 0) {
+ virStoragePoolSourceDeviceClear(&dev);
+ goto cleanup;
}
- source->ndevice = nsource;
}
source->dir = virXPathString("string(./dir/@path)", ctxt);
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index 636c9aa..e410f41 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -266,7 +266,7 @@ struct _virStoragePoolSource {
virStoragePoolSourceHostPtr hosts;
/* And either one or more devices ... */
- int ndevice;
+ size_t ndevice;
virStoragePoolSourceDevicePtr devices;
/* Or a directory */
--
1.8.3.2