提交 b327df87 编写于 作者: P Peter Krempa

util: storagefile: Split out parsing of NBD string into a separate func

Split out the code so that the function looks homogenous after adding
more protocol specific parsers.
上级 5604c056
......@@ -2354,27 +2354,20 @@ 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) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("invalid backing protocol '%s'"),
NULLSTR(backing[0]));
goto cleanup;
}
/* we know that backing[0] now equals to "nbd" */
switch ((virStorageNetProtocol) src->protocol) {
case VIR_STORAGE_NET_PROTOCOL_NBD:
if (VIR_ALLOC_N(src->hosts, 1) < 0)
goto cleanup;
src->nhosts = 1;
src->hosts->transport = VIR_STORAGE_NET_HOST_TRANS_TCP;
......@@ -2385,13 +2378,13 @@ virStorageSourceParseBackingColon(virStorageSourcePtr src,
if (!backing[1]) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("missing remote information in '%s' for protocol nbd"),
path);
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);
nbdstr);
goto cleanup;
}
......@@ -2402,7 +2395,7 @@ virStorageSourceParseBackingColon(virStorageSourcePtr src,
if (!backing[1]) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("missing host name in nbd string '%s'"),
path);
nbdstr);
goto cleanup;
}
......@@ -2412,7 +2405,7 @@ virStorageSourceParseBackingColon(virStorageSourcePtr src,
if (!backing[2]) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("missing port in nbd string '%s'"),
path);
nbdstr);
goto cleanup;
}
......@@ -2424,6 +2417,45 @@ virStorageSourceParseBackingColon(virStorageSourcePtr src,
if (VIR_STRDUP(src->path, backing[3] + strlen("exportname=")) < 0)
goto cleanup;
}
ret = 0;
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:
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册