]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix parsing of port attribute in storage XML configuration
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 12 Nov 2010 13:23:55 +0000 (13:23 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 23 Nov 2010 14:55:33 +0000 (14:55 +0000)
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
src/conf/storage_conf.c
src/conf/storage_conf.h

index 54eb80231478b4e0f0f2da358a4d1b7f800ff394..330147296a4155edb38991a1aefc3844dc5716aa 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0"?>
 <!-- A Relax NG schema for the libvirt storage pool XML format -->
 <grammar xmlns="http://relaxng.org/ns/structure/1.0"
     datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
       <attribute name='name'>
         <text/>
       </attribute>
+      <optional>
+        <attribute name='port'>
+          <ref name="PortNumber"/>
+        </attribute>
+      </optional>
       <empty/>
     </element>
   </define>
     </data>
   </define>
 
+  <define name="PortNumber">
+    <data type="short">
+      <param name="minInclusive">-1</param>
+    </data>
+  </define>
 
 </grammar>
index 067890507a4ed32d4af5a0e08d9cec024d355325..45285de9c00f8945a69cceb5fb70f2f09946ba61 100644 (file)
@@ -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) {
index fef0a462ceea75787f49f6459e87f2e01322420c..9e1f534f8d3d5371aafdb0f39dd75c4593a0ff5b 100644 (file)
@@ -155,7 +155,6 @@ typedef virStoragePoolSourceHost *virStoragePoolSourceHostPtr;
 struct _virStoragePoolSourceHost {
     char *name;
     int port;
-    int protocol;
 };