]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: storage: Split out useful bits of virStorageFileParseChainIndex
authorPeter Krempa <pkrempa@redhat.com>
Thu, 23 Feb 2017 16:10:43 +0000 (17:10 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 27 Mar 2017 07:29:57 +0000 (09:29 +0200)
The function has very specific semantics. Split out the part that parses
the backing store specification string into a separate helper so that it
can be reused later while keeping the wrapper with existing semantics.

Note that virStorageFileParseChainIndex is pretty well covered by the
test suite.

src/libvirt_private.syms
src/util/virstoragefile.c
src/util/virstoragefile.h

index 98628a4238fe536358804ed4d345232e70571e12..3091791f4acb493c006fc3d8d54414645feceb1f 100644 (file)
@@ -2495,6 +2495,7 @@ virStorageFileGetMetadataInternal;
 virStorageFileGetRelativeBackingPath;
 virStorageFileGetSCSIKey;
 virStorageFileIsClusterFS;
+virStorageFileParseBackingStoreStr;
 virStorageFileParseChainIndex;
 virStorageFileProbeFormat;
 virStorageFileResize;
index c9420fdb79216d7f5cbafb0e890c347daa85319b..c8eb26aa74e4562a36a041c9915ac9fd773fcd40 100644 (file)
@@ -1442,32 +1442,78 @@ int virStorageFileGetSCSIKey(const char *path,
 }
 #endif
 
+
+/**
+ * virStorageFileParseBackingStoreStr:
+ * @str: backing store specifier string to parse
+ * @target: returns target device portion of the string
+ * @chainIndex: returns the backing store portion of the string
+ *
+ * Parses the backing store specifier string such as vda[1], or sda into
+ * components and returns them via arguments. If the string did not specify an
+ * index, 0 is assumed.
+ *
+ * Returns 0 on success -1 on error
+ */
+int
+virStorageFileParseBackingStoreStr(const char *str,
+                                   char **target,
+                                   unsigned int *chainIndex)
+{
+    char **strings = NULL;
+    size_t nstrings;
+    unsigned int idx = 0;
+    char *suffix;
+    int ret = -1;
+
+    *chainIndex = 0;
+
+    if (!(strings = virStringSplitCount(str, "[", 2, &nstrings)))
+        return -1;
+
+    if (nstrings == 2) {
+        if (virStrToLong_uip(strings[1], &suffix, 10, &idx) < 0 ||
+            STRNEQ(suffix, "]"))
+            goto cleanup;
+    }
+
+    if (target &&
+        VIR_STRDUP(*target, strings[0]) < 0)
+        goto cleanup;
+
+    *chainIndex = idx;
+    ret = 0;
+
+ cleanup:
+    virStringListFreeCount(strings, nstrings);
+    return ret;
+}
+
+
 int
 virStorageFileParseChainIndex(const char *diskTarget,
                               const char *name,
                               unsigned int *chainIndex)
 {
-    char **strings = NULL;
     unsigned int idx = 0;
-    char *suffix;
+    char *target = NULL;
     int ret = 0;
 
     *chainIndex = 0;
 
-    if (name && diskTarget)
-        strings = virStringSplit(name, "[", 2);
+    if (!name || !diskTarget)
+        return 0;
 
-    if (virStringListLength((const char * const *)strings) != 2)
-        goto cleanup;
+    if (virStorageFileParseBackingStoreStr(name, &target, &idx) < 0)
+        return 0;
 
-    if (virStrToLong_uip(strings[1], &suffix, 10, &idx) < 0 ||
-        STRNEQ(suffix, "]"))
+    if (idx == 0)
         goto cleanup;
 
-    if (STRNEQ(diskTarget, strings[0])) {
+    if (STRNEQ(diskTarget, target)) {
         virReportError(VIR_ERR_INVALID_ARG,
                        _("requested target '%s' does not match target '%s'"),
-                       strings[0], diskTarget);
+                       target, diskTarget);
         ret = -1;
         goto cleanup;
     }
@@ -1475,7 +1521,7 @@ virStorageFileParseChainIndex(const char *diskTarget,
     *chainIndex = idx;
 
  cleanup:
-    virStringListFree(strings);
+    VIR_FREE(target);
     return ret;
 }
 
index bea1c35a2d9e52229fafce53d22662bf26013b1b..5f6e419117d36ea1618050a796eb8e561ac8656b 100644 (file)
@@ -309,6 +309,11 @@ int virStorageFileParseChainIndex(const char *diskTarget,
                                   unsigned int *chainIndex)
     ATTRIBUTE_NONNULL(3);
 
+int virStorageFileParseBackingStoreStr(const char *str,
+                                       char **target,
+                                       unsigned int *chainIndex)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
+
 virStorageSourcePtr virStorageFileChainLookup(virStorageSourcePtr chain,
                                               virStorageSourcePtr startFrom,
                                               const char *name,