diff options
| -rw-r--r-- | include/sys/stat.h | 1 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/fstatat.c | 1 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/stat.c | 22 | 
3 files changed, 19 insertions, 5 deletions
| diff --git a/include/sys/stat.h b/include/sys/stat.h index f3a52ad66..495a68cb1 100644 --- a/include/sys/stat.h +++ b/include/sys/stat.h @@ -241,6 +241,7 @@ libc_hidden_proto(fstat64)  extern int fstatat (int __fd, const char *__restrict __file,  		    struct stat *__restrict __buf, int __flag)       __THROW __nonnull ((2, 3)); +libc_hidden_proto(fstatat)  # else  #  ifdef __REDIRECT_NTH  extern int __REDIRECT_NTH (fstatat, (int __fd, const char *__restrict __file, diff --git a/libc/sysdeps/linux/common/fstatat.c b/libc/sysdeps/linux/common/fstatat.c index 06c3ab912..4006814f0 100644 --- a/libc/sysdeps/linux/common/fstatat.c +++ b/libc/sysdeps/linux/common/fstatat.c @@ -38,6 +38,7 @@ int fstatat(int fd, const char *file, struct stat *buf, int flag)  # endif /* __ARCH_HAS_DEPRECATED_SYSCALLS__ */  	return ret;  } +libc_hidden_def(fstatat)  #else  /* should add emulation with fstat() and /proc/self/fd/ ... */  #endif 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 | 
