diff options
author | Markos Chandras <markos.chandras@imgtec.com> | 2012-10-11 12:15:50 +0100 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2013-02-20 13:45:13 +0100 |
commit | 13f56c443b697190373d555b25e2577dcd32a3b6 (patch) | |
tree | a0164afaeac93ec9cdfaf1874dbdf725f3840b26 | |
parent | aec10d86476d24a68445d2deb61210f572a435e8 (diff) |
stat: Use fstatat64 if arch does not have the stat syscall
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
-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 |