
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