]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: storagefile: Split out parsing of NBD string into a separate func
authorPeter Krempa <pkrempa@redhat.com>
Tue, 4 Nov 2014 13:07:53 +0000 (14:07 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 21 Nov 2014 13:37:02 +0000 (14:37 +0100)
Split out the code so that the function looks homogenous after adding
more protocol specific parsers.

src/util/virstoragefile.c

index 0659c9fd7d5b90183da45ebffcf7a4336dae48a2..8d831b10ccbfbac41df8ee8b2cf49c6609c27e71 100644 (file)
@@ -2354,77 +2354,109 @@ virStorageSourceParseRBDColonString(const char *rbdstr,
 
 
 static int
-virStorageSourceParseBackingColon(virStorageSourcePtr src,
-                                  const char *path)
+virStorageSourceParseNBDColonString(const char *nbdstr,
+                                    virStorageSourcePtr src)
 {
     char **backing = NULL;
     int ret = -1;
 
-    if (!(backing = virStringSplit(path, ":", 0)))
+    if (!(backing = virStringSplit(nbdstr, ":", 0)))
         goto cleanup;
 
-    if (!backing[0] ||
-        (src->protocol = virStorageNetProtocolTypeFromString(backing[0])) < 0) {
+    /* we know that backing[0] now equals to "nbd" */
+
+    if (VIR_ALLOC_N(src->hosts, 1) < 0)
+        goto cleanup;
+
+    src->nhosts = 1;
+    src->hosts->transport = VIR_STORAGE_NET_HOST_TRANS_TCP;
+
+    /* format: [] denotes optional sections, uppercase are variable strings
+     * nbd:unix:/PATH/TO/SOCKET[:exportname=EXPORTNAME]
+     * nbd:HOSTNAME:PORT[:exportname=EXPORTNAME]
+     */
+    if (!backing[1]) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("invalid backing protocol '%s'"),
-                       NULLSTR(backing[0]));
+                       _("missing remote information in '%s' for protocol nbd"),
+                       nbdstr);
         goto cleanup;
-    }
+    } else if (STREQ(backing[1], "unix")) {
+        if (!backing[2]) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("missing unix socket path in nbd backing string %s"),
+                           nbdstr);
+            goto cleanup;
+        }
 
-    switch ((virStorageNetProtocol) src->protocol) {
-    case VIR_STORAGE_NET_PROTOCOL_NBD:
-        if (VIR_ALLOC_N(src->hosts, 1) < 0)
+        if (VIR_STRDUP(src->hosts->socket, backing[2]) < 0)
             goto cleanup;
-        src->nhosts = 1;
-        src->hosts->transport = VIR_STORAGE_NET_HOST_TRANS_TCP;
 
-        /* format: [] denotes optional sections, uppercase are variable strings
-         * nbd:unix:/PATH/TO/SOCKET[:exportname=EXPORTNAME]
-         * nbd:HOSTNAME:PORT[:exportname=EXPORTNAME]
-         */
+   } else {
         if (!backing[1]) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("missing remote information in '%s' for protocol nbd"),
-                           path);
+                           _("missing host name in nbd string '%s'"),
+                           nbdstr);
             goto cleanup;
-        } else if (STREQ(backing[1], "unix")) {
-            if (!backing[2]) {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("missing unix socket path in nbd backing string %s"),
-                               path);
-                goto cleanup;
-            }
+        }
 
-            if (VIR_STRDUP(src->hosts->socket, backing[2]) < 0)
-                goto cleanup;
+        if (VIR_STRDUP(src->hosts->name, backing[1]) < 0)
+            goto cleanup;
 
-       } else {
-            if (!backing[1]) {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("missing host name in nbd string '%s'"),
-                               path);
-                goto cleanup;
-            }
+        if (!backing[2]) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("missing port in nbd string '%s'"),
+                           nbdstr);
+            goto cleanup;
+        }
 
-            if (VIR_STRDUP(src->hosts->name, backing[1]) < 0)
-                goto cleanup;
+        if (VIR_STRDUP(src->hosts->port, backing[2]) < 0)
+            goto cleanup;
+    }
 
-            if (!backing[2]) {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("missing port in nbd string '%s'"),
-                               path);
-                goto cleanup;
-            }
+    if (backing[3] && STRPREFIX(backing[3], "exportname=")) {
+        if (VIR_STRDUP(src->path, backing[3] + strlen("exportname=")) < 0)
+            goto cleanup;
+    }
 
-            if (VIR_STRDUP(src->hosts->port, backing[2]) < 0)
-                goto cleanup;
-        }
+    ret = 0;
 
-        if (backing[3] && STRPREFIX(backing[3], "exportname=")) {
-            if (VIR_STRDUP(src->path, backing[3] + strlen("exportname=")) < 0)
-                goto cleanup;
-        }
-     break;
+ cleanup:
+    virStringFreeList(backing);
+
+    return ret;
+}
+
+
+static int
+virStorageSourceParseBackingColon(virStorageSourcePtr src,
+                                  const char *path)
+{
+    char *protocol = NULL;
+    const char *p;
+    int ret = -1;
+
+    if (!(p = strchr(path, ':'))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("invalid backing protocol string '%s'"),
+                       path);
+        goto cleanup;
+    }
+
+    if (VIR_STRNDUP(protocol, path, p - path) < 0)
+        goto cleanup;
+
+    if ((src->protocol = virStorageNetProtocolTypeFromString(protocol)) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("invalid backing protocol '%s'"),
+                       protocol);
+        goto cleanup;
+    }
+
+    switch ((virStorageNetProtocol) src->protocol) {
+    case VIR_STORAGE_NET_PROTOCOL_NBD:
+        if (virStorageSourceParseNBDColonString(path, src) < 0)
+            goto cleanup;
+        break;
 
     case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG:
     case VIR_STORAGE_NET_PROTOCOL_RBD:
@@ -2432,7 +2464,7 @@ virStorageSourceParseBackingColon(virStorageSourcePtr src,
     case VIR_STORAGE_NET_PROTOCOL_NONE:
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("backing store parser is not implemented for protocol %s"),
-                       backing[0]);
+                       protocol);
         goto cleanup;
 
     case VIR_STORAGE_NET_PROTOCOL_HTTP:
@@ -2444,16 +2476,15 @@ virStorageSourceParseBackingColon(virStorageSourcePtr src,
     case VIR_STORAGE_NET_PROTOCOL_GLUSTER:
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("malformed backing store path for protocol %s"),
-                       backing[0]);
+                       protocol);
         goto cleanup;
     }
 
     ret = 0;
 
  cleanup:
-    virStringFreeList(backing);
+    VIR_FREE(protocol);
     return ret;
-
 }