]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
domain_conf: Expose virDomainStorageNetworkParseHost
authorEric Blake <eblake@redhat.com>
Tue, 9 Oct 2018 20:07:35 +0000 (15:07 -0500)
committerEric Blake <eblake@redhat.com>
Thu, 14 Mar 2019 01:28:57 +0000 (20:28 -0500)
An upcoming patch wants to reuse XML parsing of both unix and tcp
network host descriptions in the context of setting up a backup
NBD server. Make that easier by refactoring the existing parser.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms

index 35001be2a8e7e15a72fc952b0dea11a8b8c8857f..356a9ae56cdf31a8c6f5305bc0e6ecebf2d7b4b8 100644 (file)
@@ -7517,23 +7517,21 @@ virDomainHostdevSubsysPCIDefParseXML(xmlNodePtr node,
 }
 
 
-static int
+int
 virDomainStorageNetworkParseHost(xmlNodePtr hostnode,
-                                 virStorageNetHostDefPtr *hosts,
-                                 size_t *nhosts)
+                                 virStorageNetHostDefPtr host)
 {
     int ret = -1;
-    virStorageNetHostDef host;
     VIR_AUTOFREE(char *) transport = NULL;
     VIR_AUTOFREE(char *) port = NULL;
 
-    memset(&host, 0, sizeof(host));
-    host.transport = VIR_STORAGE_NET_HOST_TRANS_TCP;
+    memset(host, 0, sizeof(*host));
+    host->transport = VIR_STORAGE_NET_HOST_TRANS_TCP;
 
     /* transport can be tcp (default), unix or rdma.  */
     if ((transport = virXMLPropString(hostnode, "transport"))) {
-        host.transport = virStorageNetHostTransportTypeFromString(transport);
-        if (host.transport < 0) {
+        host->transport = virStorageNetHostTransportTypeFromString(transport);
+        if (host->transport < 0) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                            _("unknown protocol transport type '%s'"),
                            transport);
@@ -7541,17 +7539,17 @@ virDomainStorageNetworkParseHost(xmlNodePtr hostnode,
         }
     }
 
-    host.socket = virXMLPropString(hostnode, "socket");
+    host->socket = virXMLPropString(hostnode, "socket");
 
-    if (host.transport == VIR_STORAGE_NET_HOST_TRANS_UNIX &&
-        host.socket == NULL) {
+    if (host->transport == VIR_STORAGE_NET_HOST_TRANS_UNIX &&
+        host->socket == NULL) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("missing socket for unix transport"));
         goto cleanup;
     }
 
-    if (host.transport != VIR_STORAGE_NET_HOST_TRANS_UNIX &&
-        host.socket != NULL) {
+    if (host->transport != VIR_STORAGE_NET_HOST_TRANS_UNIX &&
+        host->socket != NULL) {
         virReportError(VIR_ERR_XML_ERROR,
                        _("transport '%s' does not support "
                          "socket attribute"),
@@ -7559,26 +7557,24 @@ virDomainStorageNetworkParseHost(xmlNodePtr hostnode,
         goto cleanup;
     }
 
-    if (host.transport != VIR_STORAGE_NET_HOST_TRANS_UNIX) {
-        if (!(host.name = virXMLPropString(hostnode, "name"))) {
+    if (host->transport != VIR_STORAGE_NET_HOST_TRANS_UNIX) {
+        if (!(host->name = virXMLPropString(hostnode, "name"))) {
             virReportError(VIR_ERR_XML_ERROR, "%s",
                            _("missing name for host"));
             goto cleanup;
         }
 
         if ((port = virXMLPropString(hostnode, "port"))) {
-            if (virStringParsePort(port, &host.port) < 0)
+            if (virStringParsePort(port, &host->port) < 0)
                 goto cleanup;
         }
     }
 
-    if (VIR_APPEND_ELEMENT(*hosts, *nhosts, host) < 0)
-        goto cleanup;
-
     ret = 0;
 
  cleanup:
-    virStorageNetHostDefClear(&host);
+    if (ret < 0)
+        virStorageNetHostDefClear(host);
     return ret;
 }
 
@@ -7593,9 +7589,14 @@ virDomainStorageNetworkParseHosts(xmlNodePtr node,
     for (child = node->children; child; child = child->next) {
         if (child->type == XML_ELEMENT_NODE &&
             virXMLNodeNameEqual(child, "host")) {
+            virStorageNetHostDef host;
 
-            if (virDomainStorageNetworkParseHost(child, hosts, nhosts) < 0)
+            if (virDomainStorageNetworkParseHost(child, &host) < 0)
+                return -1;
+            if (VIR_APPEND_ELEMENT(*hosts, *nhosts, host) < 0) {
+                virStorageNetHostDefClear(&host);
                 return -1;
+            }
         }
     }
 
index 78e7ccb4637f178ff961d16bc0a9ec7a86ac31d2..50d2173654fab2334310d0df1306f45c9d16e3cb 100644 (file)
@@ -3273,6 +3273,8 @@ int virDomainDiskInsert(virDomainDefPtr def,
     ATTRIBUTE_RETURN_CHECK;
 void virDomainDiskInsertPreAlloced(virDomainDefPtr def,
                                    virDomainDiskDefPtr disk);
+int virDomainStorageNetworkParseHost(xmlNodePtr hostnode,
+                                     virStorageNetHostDefPtr host);
 int virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt,
                                   virDomainDiskDefPtr def,
                                   const virDomainDef *vmdef);
index 92a86943b1643015cc8c3d658a065fd2c4c2b7ad..9582b722628016fc868c66bd1e854ce229a73451 100644 (file)
@@ -562,6 +562,7 @@ virDomainStateReasonFromString;
 virDomainStateReasonToString;
 virDomainStateTypeFromString;
 virDomainStateTypeToString;
+virDomainStorageNetworkParseHost;
 virDomainStorageSourceFormat;
 virDomainStorageSourceParse;
 virDomainTaintTypeFromString;