The XML docs describe a 'port' attribute for the
storage source <host> element, but the parser never
handled it.
* docs/schemas/storagepool.rng: Define port attribute
* src/conf/storage_conf.c: Add missing parsing/formatting
of host port number
* src/conf/storage_conf.h: Remove bogus/unused 'protocol' field
---
docs/schemas/storagepool.rng | 5 +++++
src/conf/storage_conf.c | 21 +++++++++++++++++++--
src/conf/storage_conf.h | 1 -
3 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/docs/schemas/storagepool.rng b/docs/schemas/storagepool.rng
index 54eb802..8f067f3 100644
--- a/docs/schemas/storagepool.rng
+++ b/docs/schemas/storagepool.rng
@@ -186,6 +186,11 @@
<attribute name='name'>
<text/>
</attribute>
+ <optional>
+ <attribute name='port'>
+ <text/>
+ </attribute>
+ </optional>
<empty/>
</element>
</define>
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 0678905..45285de 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -396,6 +396,7 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
char *authType = NULL;
int nsource, i;
virStoragePoolOptionsPtr options;
+ char *port;
relnode = ctxt->node;
ctxt->node = node;
@@ -423,6 +424,17 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
}
source->host.name = virXPathString("string(./host/@name)", ctxt);
+ port = virXPathString("string(./host/@port)", ctxt);
+ if (port) {
+ if (virStrToLong_i(port, NULL, 10, &source->host.port) < 0) {
+ virStorageReportError(VIR_ERR_XML_ERROR,
+ _("Invalid port number: %s"),
+ port);
+ goto cleanup;
+ }
+ }
+
+
source->initiator.iqn = virXPathString("string(./initiator/iqn/@name)",
ctxt);
nsource = virXPathNodeSet("./device", ctxt, &nodeset);
@@ -475,6 +487,7 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
cleanup:
ctxt->node = relnode;
+ VIR_FREE(port);
VIR_FREE(authType);
VIR_FREE(nodeset);
return ret;
@@ -790,8 +803,12 @@ virStoragePoolSourceFormat(virBufferPtr buf,
virBufferAddLit(buf," <source>\n");
if ((options->flags & VIR_STORAGE_POOL_SOURCE_HOST) &&
- src->host.name)
- virBufferVSprintf(buf," <host name='%s'/>\n",
src->host.name);
+ src->host.name) {
+ virBufferVSprintf(buf, " <host name='%s'",
src->host.name);
+ if (src->host.port)
+ virBufferVSprintf(buf, " port='%d'", src->host.port);
+ virBufferAddLit(buf, "/>\n");
+ }
if ((options->flags & VIR_STORAGE_POOL_SOURCE_DEVICE) &&
src->ndevice) {
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index fef0a46..9e1f534 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -155,7 +155,6 @@ typedef virStoragePoolSourceHost *virStoragePoolSourceHostPtr;
struct _virStoragePoolSourceHost {
char *name;
int port;
- int protocol;
};
--
1.7.2.3