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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list