diff options
Diffstat (limited to 'libc/sysdeps/linux/common/stat.c')
-rw-r--r-- | libc/sysdeps/linux/common/stat.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/libc/sysdeps/linux/common/stat.c b/libc/sysdeps/linux/common/stat.c index 829f35a93..c7e213838 100644 --- a/libc/sysdeps/linux/common/stat.c +++ b/libc/sysdeps/linux/common/stat.c @@ -10,14 +10,24 @@ #include <sys/syscall.h> #include <unistd.h> #include <sys/stat.h> -#include "xstatconv.h" #undef stat +#if defined __NR_fstatat64 && !defined __NR_stat +# include <fcntl.h> + +int stat(const char *file_name, struct stat *buf) +{ + return fstatat(AT_FDCWD, file_name, buf, 0); +} + +#else +# include "xstatconv.h" + int stat(const char *file_name, struct stat *buf) { int result; -#ifdef __NR_stat64 +# ifdef __NR_stat64 /* normal stat call has limited values for various stat elements * e.g. uid device major/minor etc. * so we use 64 variant if available @@ -28,19 +38,21 @@ int stat(const char *file_name, struct stat *buf) if (result == 0) { __xstat32_conv(&kbuf, buf); } -#else +# else struct kernel_stat kbuf; result = INLINE_SYSCALL(stat, 2, file_name, &kbuf); if (result == 0) { __xstat_conv(&kbuf, buf); } -#endif +# endif /* __NR_stat64 */ return result; } +#endif /* __NR_fstat64 */ libc_hidden_def(stat) -#if ! defined __NR_stat64 && defined __UCLIBC_HAS_LFS__ +#if ! defined __NR_stat64 && ! defined __NR_fstatat64 && \ + defined __UCLIBC_HAS_LFS__ strong_alias_untyped(stat,stat64) libc_hidden_def(stat64) #endif |