only use fstatat and others legacy stat syscalls if they exist

riscv32 and future architectures only provide statx.
This commit is contained in:
Rich Felker 2022-04-28 02:24:44 -04:00
parent 2b754a5424
commit fb10dc288d

View File

@ -6,7 +6,6 @@
#include <stdint.h>
#include <sys/sysmacros.h>
#include "syscall.h"
#include "kstat.h"
struct statx {
uint32_t stx_mask;
@ -69,6 +68,10 @@ static int fstatat_statx(int fd, const char *restrict path, struct stat *restric
return 0;
}
#ifdef SYS_fstatat
#include "kstat.h"
static int fstatat_kstat(int fd, const char *restrict path, struct stat *restrict st, int flag)
{
int ret;
@ -130,15 +133,20 @@ static int fstatat_kstat(int fd, const char *restrict path, struct stat *restric
return 0;
}
#endif
int __fstatat(int fd, const char *restrict path, struct stat *restrict st, int flag)
{
int ret;
#ifdef SYS_fstatat
if (sizeof((struct kstat){0}.st_atime_sec) < sizeof(time_t)) {
ret = fstatat_statx(fd, path, st, flag);
if (ret!=-ENOSYS) return __syscall_ret(ret);
}
ret = fstatat_kstat(fd, path, st, flag);
#else
ret = fstatat_statx(fd, path, st, flag);
#endif
return __syscall_ret(ret);
}