OSDN Git Service

fstat: Use fstat64 if arch does not have the fstat syscall
authorMarkos Chandras <markos.chandras@imgtec.com>
Mon, 14 Jan 2013 15:57:03 +0000 (15:57 +0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 20 Feb 2013 12:45:12 +0000 (13:45 +0100)
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
libc/sysdeps/linux/common/fstat.c
libc/sysdeps/linux/common/fstat64.c

index 4726a68..696f79e 100644 (file)
 #include <sys/stat.h>
 #include "xstatconv.h"
 
+#if defined __NR_fstat64 && !defined __NR_fstat
+int fstat(int fd, struct stat *buf)
+{
+       int result = INLINE_SYSCALL(fstat64, 2, fd, buf);
+       if (result == 0) {
+               /* Did we overflow? */
+               if (buf->__pad1 || buf->__pad2 || buf->__pad3
+                   || buf->__pad4 || buf->__pad5
+                   || buf->__pad6 || buf->__pad7) {
+                       __set_errno(EOVERFLOW);
+                       return -1;
+               }
+       }
+       return result;
+}
+libc_hidden_def(fstat)
+
+#elif defined __NR_fstat
 int fstat(int fd, struct stat *buf)
 {
        int result;
-#ifdef __NR_fstat64
+# ifdef __NR_fstat64
        /* normal stat call has limited values for various stat elements
         * e.g. uid device major/minor etc.
         * so we use 64 variant if available
@@ -26,19 +44,21 @@ int fstat(int fd, struct stat *buf)
        if (result == 0) {
                __xstat32_conv(&kbuf, buf);
        }
-#else
+# else
        struct kernel_stat kbuf;
 
        result = INLINE_SYSCALL(fstat, 2, fd, &kbuf);
        if (result == 0) {
                __xstat_conv(&kbuf, buf);
        }
-#endif
+# endif
        return result;
 }
 libc_hidden_def(fstat)
 
-#if ! defined __NR_fstat64 && defined __UCLIBC_HAS_LFS__
+# if ! defined __NR_fstat64 && defined __UCLIBC_HAS_LFS__
 strong_alias_untyped(fstat,fstat64)
 libc_hidden_def(fstat64)
+# endif
+
 #endif
index 7460c26..aaaf03e 100644 (file)
@@ -20,6 +20,7 @@ static __always_inline _syscall2(int, __syscall_fstat64,
 
 int fstat64(int fd, struct stat64 *buf)
 {
+#ifdef __ARCH_HAS_DEPRECATED_SYSCALLS__
        int result;
        struct kernel_stat64 kbuf;
 
@@ -28,6 +29,9 @@ int fstat64(int fd, struct stat64 *buf)
                __xstat64_conv(&kbuf, buf);
        }
        return result;
+#else
+       return __syscall_fstat64(fd, buf);
+#endif
 }
 libc_hidden_def(fstat64)
 #endif