[libvirt] [PATCH 3/4] conf: snapshot: Refactor virDomainSnapshotDefAssignExternalNames
Erik Skultety
eskultet at redhat.com
Thu Feb 11 14:17:45 UTC 2016
On 11/02/16 10:20, Peter Krempa wrote:
> Get rid of one indentation level by negating condition and remove ugly
> pointer arithmetic at the cost of one extra allocation.
> ---
> src/conf/snapshot_conf.c | 94 +++++++++++++++++++++++-------------------------
> 1 file changed, 44 insertions(+), 50 deletions(-)
>
> diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
> index da6fec5..f8a1aed 100644
> --- a/src/conf/snapshot_conf.c
> +++ b/src/conf/snapshot_conf.c
> @@ -440,66 +440,60 @@ virDomainSnapshotDefParseString(const char *xmlStr,
> ...
> ...
> - tmp = strrchr(original, '.');
> - if (!tmp || strchr(tmp, '/')) {
> - if (virAsprintf(&disk->src->path, "%s.%s", original,
> - def->name) < 0)
> - goto cleanup;
> - } else {
> - if ((tmp - original) > INT_MAX) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("integer overflow"));
> - goto cleanup;
> - }
> - if (virAsprintf(&disk->src->path, "%.*s.%s",
> - (int) (tmp - original), original,
> - def->name) < 0)
> - goto cleanup;
> - }
This was black magic indeed.
> + if (!(origpath = virDomainDiskGetSource(def->dom->disks[i]))) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("cannot generate external snapshot name "
> + "for disk '%s' without source"),
> + disk->name);
> + return -1;
> }
> - }
>
> - ret = 0;
> + if (stat(origpath, &sb) < 0 || !S_ISREG(sb.st_mode)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("source for disk '%s' is not a regular "
> + "file; refusing to generate external "
> + "snapshot name"),
> + disk->name);
> + return -1;
> + }
>
> - cleanup:
> - return ret;
> + if (VIR_STRDUP(tmppath, origpath) < 0)
> + return -1;
> +
> + /* drop suffix of the file name */
> + if ((tmp = strrchr(tmppath, '.')) && !strchr(tmp, '/'))
> + *tmp = '\0';
> +
> + if (virAsprintf(&disk->src->path, "%s.%s", tmppath, def->name) < 0) {
> + VIR_FREE(tmppath);
> + return -1;
> + }
> +
> + VIR_FREE(tmppath);
> + }
> +
> + return 0;
> }
>
Nicely done, ACK.
Erik
More information about the libvir-list
mailing list