[libvirt] [PATCH 01/11] Fix parsing of port attribute in storage XML configuration

Daniel P. Berrange berrange at redhat.com
Fri Nov 12 16:22:34 UTC 2010


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




More information about the libvir-list mailing list