]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: Fix virStorageBackendIQNFound() to work on FreeBSD
authorAndrea Bolognani <abologna@redhat.com>
Wed, 25 Jul 2018 09:18:39 +0000 (11:18 +0200)
committerAndrea Bolognani <abologna@redhat.com>
Wed, 25 Jul 2018 11:23:10 +0000 (13:23 +0200)
Despite being standardized in POSIX.1-2008, the 'm'
sscanf() modifier is currently not available on FreeBSD.

Reimplement parsing without sscanf() to work around the
issue.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
src/util/viriscsi.c

index e2c80acaaa9c794ad215f17b2274f1d5d93a647a..653b4fd93291ecabc2b130a3b621c551dab4ae89 100644 (file)
@@ -146,8 +146,10 @@ virStorageBackendIQNFound(const char *initiatoriqn,
 
     line = outbuf;
     while (line && *line) {
+        char *current = line;
         char *newline;
-        int num;
+        char *next;
+        size_t i;
 
         if (!(newline = strchr(line, '\n')))
             break;
@@ -156,15 +158,29 @@ virStorageBackendIQNFound(const char *initiatoriqn,
 
         VIR_FREE(iface);
         VIR_FREE(iqn);
-        num = sscanf(line, "%ms %*[^,],%*[^,],%*[^,],%*[^,],%ms", &iface, &iqn);
 
-        if (num != 2) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("malformed output of %s: %s"),
-                           ISCSIADM, line);
+        /* Find the first space, copy everything up to that point into
+         * iface and move past it to continue processing */
+        if (!(next = strchr(current, ' ')))
+            goto error;
+
+        if (VIR_STRNDUP(iface, current, (next - current)) < 0)
             goto cleanup;
+
+        current = next + 1;
+
+        /* There are five comma separated fields after iface and we only
+         * care about the last one, so we need to skip four commas and
+         * copy whatever's left into iqn */
+        for (i = 0; i < 4; i++) {
+            if (!(next = strchr(current, ',')))
+                goto error;
+            current = next + 1;
         }
 
+        if (VIR_STRDUP(iqn, current) < 0)
+            goto cleanup;
+
         if (STREQ(iqn, initiatoriqn)) {
             VIR_STEAL_PTR(*ifacename, iface);
 
@@ -186,6 +202,12 @@ virStorageBackendIQNFound(const char *initiatoriqn,
     VIR_FREE(outbuf);
     virCommandFree(cmd);
     return ret;
+
+ error:
+    virReportError(VIR_ERR_INTERNAL_ERROR,
+                   _("malformed output of %s: %s"),
+                   ISCSIADM, line);
+    goto cleanup;
 }