Compatibility function for faccessat

This commit is contained in:
Benny Baumann 2020-11-07 22:51:46 +01:00 committed by BenBE
parent 09fe94da18
commit 98fce1fb43
4 changed files with 43 additions and 1 deletions

View File

@ -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,

View File

@ -11,6 +11,11 @@ in the source distribution for its full text.
#include <sys/stat.h>
int Compat_faccessat(int dirfd,
const char* pathname,
int mode,
int flags);
int Compat_fstatat(int dirfd,
const char* dirpath,
const char* pathname,

View File

@ -88,7 +88,7 @@ AC_TYPE_UID_T
# ----------------------------------------------------------------------
AC_FUNC_CLOSEDIR_VOID
AC_FUNC_STAT
AC_CHECK_FUNCS([fstatat memmove readlinkat strdup strncasecmp strstr])
AC_CHECK_FUNCS([faccessat fstatat memmove readlinkat strdup strncasecmp strstr])
AC_SEARCH_LIBS([dlopen], [dl dld])

View File

@ -37,6 +37,7 @@ in the source distribution for its full text.
#endif
#include "CRT.h"
#include "Compat.h"
#include "LinuxProcess.h"
#include "Macros.h"
#include "Object.h"