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/fstatat.c | 1 + libc/sysdeps/linux/common/stat.c | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) (limited to 'libc/sysdeps') 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 #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