From 57c7b40b76453f5f07b6b446f4ba4c5d7e7ec235 Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Tue, 16 Aug 2011 15:36:22 -0400 Subject: [PATCH] maint: fix some compilation issues on non-linux platforms (part 2) Get rid of the #if __linux__ check in virPidFileReadPathIfAlive that was preventing a check of a symbolic link in /proc//exe on non-linux platforms against an expected executable. Replace this with a run-time check testing whether the /proc//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 | 1 + src/util/util.c | 17 +++++++++++++++++ src/util/util.h | 3 +++ src/util/virpidfile.c | 7 ++++--- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 39d3dc4c6a..acae122bc2 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1047,6 +1047,7 @@ virFileExists; virFileFindMountPoint; virFileHasSuffix; virFileIsExecutable; +virFileIsLink; virFileLinkPointsTo; virFileLock; virFileMakePath; diff --git a/src/util/util.c b/src/util/util.c index e3b216f8aa..b278165a32 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -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" diff --git a/src/util/util.h b/src/util/util.h index e76da9cd18..6e6265f5d9 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -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); diff --git a/src/util/virpidfile.c b/src/util/virpidfile.c index 7dd3c51ad9..e64b0b3139 100644 --- a/src/util/virpidfile.c +++ b/src/util/virpidfile.c @@ -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; -- GitLab