On 04/11/2014 12:21 AM, Eric Blake wrote: > When checking if two filenames point to the same inode (whether > by hardlink or symlink), sometimes one of the names might be > relative. This convenience function makes it easier to check. > > * src/util/virfile.h (virFileRelLinkPointsTo): New prototype. > * src/util/virfile.c (virFileRelLinkPointsTo): New function. > * src/libvirt_private.syms (virfile.h): Export it. > * src/xen/xm_internal.c (xenXMDomainGetAutostart): Use it. > > Signed-off-by: Eric Blake <eblake@xxxxxxxxxx> > --- > src/libvirt_private.syms | 1 + > src/util/virfile.c | 26 +++++++++++++++++++++++++- > src/util/virfile.h | 3 +++ > src/xen/xm_internal.c | 11 +++++------ > 4 files changed, 34 insertions(+), 7 deletions(-) > > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms > index cd43335..c2bce13 100644 > --- a/src/libvirt_private.syms > +++ b/src/libvirt_private.syms > @@ -1255,6 +1255,7 @@ virFilePrintf; > virFileReadAll; > virFileReadHeaderFD; > virFileReadLimFD; > +virFileRelLinkPointsTo; > virFileResolveAllLinks; > virFileResolveLink; > virFileRewrite; > diff --git a/src/util/virfile.c b/src/util/virfile.c > index a28cbf1..10c4337 100644 > --- a/src/util/virfile.c > +++ b/src/util/virfile.c > @@ -1368,7 +1368,8 @@ virFileHasSuffix(const char *str, > && (Stat_buf_1).st_dev == (Stat_buf_2).st_dev) > > /* Return nonzero if checkLink and checkDest > - refer to the same file. Otherwise, return 0. */ > + * refer to the same file. Otherwise, return 0. > + */ > int > virFileLinkPointsTo(const char *checkLink, > const char *checkDest) > @@ -1382,6 +1383,29 @@ virFileLinkPointsTo(const char *checkLink, > } > > > +/* Return positive if checkLink (residing within directory if not > + * absolute) and checkDest refer to the same file. Otherwise, return > + * -1 on allocation failure (error reported), or 0 if not the same > + * (silent). > + */ > +int > +virFileRelLinkPointsTo(const char *directory, > + const char *checkLink, > + const char *checkDest) > +{ > + char *candidate; > + int ret; > + > + if (*checkLink == '/') > + return virFileLinkPointsTo(checkLink, checkDest); > + if (virAsprintf(&candidate, "%s/%s", directory, checkLink) < 0) > + return -1; > + ret = virFileLinkPointsTo(candidate, checkDest); > + VIR_FREE(candidate); > + return ret; > +} > + > + > static int > virFileResolveLinkHelper(const char *linkpath, > bool intermediatePaths, > diff --git a/src/util/virfile.h b/src/util/virfile.h > index 638378a..168eb0d 100644 > --- a/src/util/virfile.h > +++ b/src/util/virfile.h > @@ -144,6 +144,9 @@ int virFileStripSuffix(char *str, > > int virFileLinkPointsTo(const char *checkLink, > const char *checkDest); > +int virFileRelLinkPointsTo(const char *directory, > + const char *checkLink, > + const char *checkDest); Should there be a ATTRIBUTE_NONNULL(1,2,3) here?? Probably same for PointsTo argument 1... > > int virFileResolveLink(const char *linkpath, > char **resultpath) ATTRIBUTE_RETURN_CHECK; > diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c > index 52d2a1e..f25a7df 100644 > --- a/src/xen/xm_internal.c > +++ b/src/xen/xm_internal.c > @@ -1427,25 +1427,24 @@ int > xenXMDomainGetAutostart(virDomainDefPtr def, > int *autostart) > { > - char *linkname = xenXMAutostartLinkName(def); > char *config = xenXMDomainConfigName(def); > int ret = -1; > > - if (!linkname || !config) > + if (!config) > goto cleanup; > > - *autostart = virFileLinkPointsTo(linkname, config); > + *autostart = virFileRelLinkPointsTo("/etc/xen/auto/", def->name, config); > if (*autostart < 0) { > virReportSystemError(errno, > - _("cannot check link %s points to config %s"), > - linkname, config); > + _("cannot check link /etc/xen/auto/%s points " > + "to config %s"), > + def->name, config); > goto cleanup; > } > > ret = 0; > > cleanup: > - VIR_FREE(linkname); > VIR_FREE(config); > return ret; > } > ACK in general though John -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list