
On 11/20/14 16:16, John Ferlan wrote:
On 11/12/2014 08:47 AM, Peter Krempa wrote:
Split out the code so that the function looks homogenous after adding more protocol specific parsers. --- src/util/virstoragefile.c | 141 ++++++++++++++++++++++++++++------------------ 1 file changed, 86 insertions(+), 55 deletions(-)
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index f267d1a..58be237 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -2353,77 +2353,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]) {
IOW: If someone provided just "nbd:", right?
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);
How could this ever have happened?
We have : if (!backing[1]) error else if (STREQ(backing[1], "unix")) ... else if (!backing[1]) different error
Yep, that doesn't make sense. That is probably an artifact from the time I wrote the func :/. I'll remove it in a follow up to keep the split-out patch intact in the semantic way.
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 someone provides "nbd:HOSTNAME:PORT:exportnam=EXPORTNAME" by mistake are they never told of their error? I know - we're not in the business of validating mistakes, but it seems a shame to avoid the opportunity...
Yes we could do a better job here. Additionally there is a second function doing similar stuff in the qemu_command file. I'll post a patch to unify and clean up them as a follow up as this would be out of scope of the split-out patch.
ACK anyway,
John
- 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: @@ -2431,7 +2463,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: @@ -2443,16 +2475,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; - }
Peter