From 13f56c443b697190373d555b25e2577dcd32a3b6 Mon Sep 17 00:00:00 2001 From: Markos Chandras Date: Thu, 11 Oct 2012 12:15:50 +0100 Subject: stat: Use fstatat64 if arch does not have the stat syscall Signed-off-by: Markos Chandras Signed-off-by: Bernhard Reutner-Fischer --- libc/sysdeps/linux/common/stat.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'libc/sysdeps/linux/common/stat.c') 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 #include #include -#include "xstatconv.h" #undef stat +#if defined __NR_fstatat64 && !defined __NR_stat +# include + +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 -- cgit v1.2.3