summaryrefslogtreecommitdiffstats
path: root/Compat.c
diff options
context:
space:
mode:
authorBenny Baumann <BenBE@geshi.org>2020-11-07 22:51:46 +0100
committerBenBE <BenBE@geshi.org>2020-11-24 19:05:48 +0100
commit98fce1fb43d66f5c74090094be589fe7f859ed20 (patch)
treeadde56c11013849ba9b923486d4a8252c92c5266 /Compat.c
parent09fe94da18d33d2c4e1fe415e8346fa99b9944b4 (diff)
Compatibility function for faccessat
Diffstat (limited to 'Compat.c')
-rw-r--r--Compat.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/Compat.c b/Compat.c
index 096b938a..37e7c042 100644
--- a/Compat.c
+++ b/Compat.c
@@ -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,

© 2014-2024 Faster IT GmbH | imprint | privacy policy