]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
maint: fix some compilation issues on non-linux platforms (part 2)
authorStefan Berger <stefanb@us.ibm.com>
Tue, 16 Aug 2011 19:36:22 +0000 (15:36 -0400)
committerStefan Berger <stefanb@us.ibm.com>
Tue, 16 Aug 2011 19:36:22 +0000 (15:36 -0400)
Get rid of the #if __linux__ check in virPidFileReadPathIfAlive that
was preventing a check of a symbolic link in /proc/<pid>/exe on
non-linux platforms against an expected executable. Replace
this with a run-time check testing whether the /proc/<pid>/exe is a
symbolic link and if so call the function doing the comparison
against the expected file the link is supposed to point to.

src/libvirt_private.syms
src/util/util.c
src/util/util.h
src/util/virpidfile.c

index 39d3dc4c6a3f12bd6d01a07a2bf116ca67739743..acae122bc2668de3513d60caa88e212f557d2741 100644 (file)
@@ -1047,6 +1047,7 @@ virFileExists;
 virFileFindMountPoint;
 virFileHasSuffix;
 virFileIsExecutable;
+virFileIsLink;
 virFileLinkPointsTo;
 virFileLock;
 virFileMakePath;
index e3b216f8aa3b1717cda45099f8e496e746b8b1b8..b278165a3275cb454190af1eaf1d808845358a62 100644 (file)
@@ -570,6 +570,23 @@ int virFileResolveLink(const char *linkpath,
     return *resultpath == NULL ? -1 : 0;
 }
 
+
+/*
+ * Check whether the given file is a link.
+ * Returns 1 in case of the file being a link, 0 in case it is not
+ * a link and the negative errno in all other cases.
+ */
+int virFileIsLink(const char *linkpath)
+{
+    struct stat st;
+
+    if (lstat(linkpath, &st) < 0)
+        return -errno;
+
+    return (S_ISLNK(st.st_mode) != 0);
+}
+
+
 /*
  * Finds a requested executable file in the PATH env. e.g.:
  * "kvm-img" will return "/usr/bin/kvm-img"
index e76da9cd183cd7d4ee5a440a261b5079571cd2f0..6e6265f5d9ea0cec7142dee362f88313cb94aa7d 100644 (file)
@@ -78,6 +78,9 @@ int virFileLinkPointsTo(const char *checkLink,
 int virFileResolveLink(const char *linkpath,
                        char **resultpath) ATTRIBUTE_RETURN_CHECK;
 
+int virFileIsLink(const char *linkpath)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+
 char *virFindFileInPath(const char *file);
 
 bool virFileExists(const char *file) ATTRIBUTE_NONNULL(1);
index 7dd3c51ad96c83413c2f18b3ba7c4598a2f1aae6..e64b0b3139b13969fa4c3654f93f949c14ea88d4 100644 (file)
@@ -210,10 +210,11 @@ int virPidFileReadPathIfAlive(const char *path,
         *pid = -1;
         return 0;
     }
-#ifdef __linux__
-    if (virFileLinkPointsTo(procpath, binpath) == 0)
+
+    if (virFileIsLink(procpath) &&
+        virFileLinkPointsTo(procpath, binpath) == 0)
         *pid = -1;
-#endif
+
     VIR_FREE(procpath);
 
     return 0;