diff options
author | Benny Baumann <BenBE@geshi.org> | 2020-11-07 22:51:46 +0100 |
---|---|---|
committer | BenBE <BenBE@geshi.org> | 2020-11-24 19:05:48 +0100 |
commit | 98fce1fb43d66f5c74090094be589fe7f859ed20 (patch) | |
tree | adde56c11013849ba9b923486d4a8252c92c5266 /Compat.c | |
parent | 09fe94da18d33d2c4e1fe415e8346fa99b9944b4 (diff) |
Compatibility function for faccessat
Diffstat (limited to 'Compat.c')
-rw-r--r-- | Compat.c | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -9,6 +9,7 @@ in the source distribution for its full text. #include "Compat.h" +#include <errno.h> #include <fcntl.h> // IWYU pragma: keep #include <unistd.h> #include <sys/stat.h> @@ -17,6 +18,41 @@ in the source distribution for its full text. #include "XUtils.h" // IWYU pragma: keep +int Compat_faccessat(int dirfd, + const char* pathname, + int mode, + int flags) { + int ret; + +#ifdef HAVE_FACCESSAT + + // Implementation note: AT_SYMLINK_NOFOLLOW unsupported on FreeBSD, fallback to lstat in that case + + errno = 0; + + ret = faccessat(dirfd, pathname, mode, flags); + if (!ret || errno != EINVAL) + return ret; + +#endif + + // Error out on unsupported configurations + if (dirfd != AT_FDCWD || mode != F_OK) { + errno = EINVAL; + return -1; + } + + // Fallback to stat(2)/lstat(2) depending on flags + struct stat statinfo; + if(flags) { + ret = lstat(pathname, &statinfo); + } else { + ret = stat(pathname, &statinfo); + } + + return ret; +} + int Compat_fstatat(int dirfd, const char* dirpath, const char* pathname, |