]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: new virFileRelLinkPointsTo function
authorEric Blake <eblake@redhat.com>
Thu, 10 Apr 2014 23:36:06 +0000 (17:36 -0600)
committerEric Blake <eblake@redhat.com>
Sat, 12 Apr 2014 02:00:42 +0000 (20:00 -0600)
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@redhat.com>
src/libvirt_private.syms
src/util/virfile.c
src/util/virfile.h
src/xen/xm_internal.c

index 6e807c49195f3a0f48959027553c729557c1c81c..0e81f2f95263b18ea0f7110cc8bc9a06b64c0829 100644 (file)
@@ -1255,6 +1255,7 @@ virFilePrintf;
 virFileReadAll;
 virFileReadHeaderFD;
 virFileReadLimFD;
+virFileRelLinkPointsTo;
 virFileResolveAllLinks;
 virFileResolveLink;
 virFileRewrite;
index a28cbf144190cdc40c571f4efef666c98b4b6d65..3eb2703c0df95f3c891917790393cf5d47892bc7 100644 (file)
@@ -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,35 @@ 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 (!directory) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("cannot resolve '%s' without starting directory"),
+                       checkLink);
+        return -1;
+    }
+    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,
index 638378a2af884c07c0d380f66c5ce25ee4c97184..46ef781479e560d75c3825dbc79ac7d344645fb5 100644 (file)
@@ -143,7 +143,12 @@ int virFileStripSuffix(char *str,
                        const char *suffix) ATTRIBUTE_RETURN_CHECK;
 
 int virFileLinkPointsTo(const char *checkLink,
-                        const char *checkDest);
+                        const char *checkDest)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+int virFileRelLinkPointsTo(const char *directory,
+                           const char *checkLink,
+                           const char *checkDest)
+    ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
 
 int virFileResolveLink(const char *linkpath,
                        char **resultpath) ATTRIBUTE_RETURN_CHECK;
index 52d2a1e039bfe3422a9f883feaff03edb090abe2..f25a7df6de492b3c9f6b5991c3afccbfdcfd7df7 100644 (file)
@@ -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;
 }