mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 07:17:44 +00:00
util: Fix virStorageBackendIQNFound() to work on FreeBSD
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>
This commit is contained in:
parent
f26958462e
commit
f025c1bf79
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user