about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/fxstat.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/fxstat.c')
-rw-r--r--sysdeps/unix/sysv/linux/fxstat.c62
1 files changed, 31 insertions, 31 deletions
diff --git a/sysdeps/unix/sysv/linux/fxstat.c b/sysdeps/unix/sysv/linux/fxstat.c
index a88404b5c3..b46e344d0e 100644
--- a/sysdeps/unix/sysv/linux/fxstat.c
+++ b/sysdeps/unix/sysv/linux/fxstat.c
@@ -16,46 +16,46 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-/* Ho hum, if xstat == xstat64 we must get rid of the prototype or gcc
-   will complain since they don't strictly match.  */
-#define __fxstat64 __fxstat64_disable
-
-#include <errno.h>
-#include <stddef.h>
-#include <sys/types.h>
 #include <sys/stat.h>
+#include <fcntl.h>
 #include <kernel_stat.h>
-
 #include <sysdep.h>
-#include <sys/syscall.h>
 
-#include <xstatconv.h>
+#if !XSTAT_IS_XSTAT64
+# include <xstatconv.h>
+# include <xstatover.h>
 
 /* Get information about the file FD in BUF.  */
 int
 __fxstat (int vers, int fd, struct stat *buf)
 {
-  if (vers == _STAT_VER_KERNEL)
-    return INLINE_SYSCALL (fstat, 2, fd, buf);
-
-#if STAT_IS_KERNEL_STAT
-  return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
-#else
-  struct kernel_stat kbuf;
-  int result;
-
-  result = INLINE_SYSCALL (fstat, 2, fd, &kbuf);
-  if (result == 0)
-    result = __xstat_conv (vers, &kbuf, buf);
-
-  return result;
+  switch (vers)
+    {
+    case _STAT_VER_KERNEL:
+      {
+# if STAT_IS_KERNEL_STAT
+	/* New kABIs which uses generic pre 64-bit time Linux ABI,
+	   e.g. csky, nios2  */
+	int r = INLINE_SYSCALL_CALL (fstat64, fd, buf);
+	return r ?: stat_overflow (buf);
+# else
+	/* Old kABIs with old non-LFS support, e.g. arm, i386, hppa, m68k,
+	   microblaze, s390, sh, powerpc, and sparc.  */
+	return INLINE_SYSCALL_CALL (fstat, fd, buf);
+# endif
+      }
+
+    default:
+      {
+# if STAT_IS_KERNEL_STAT
+	return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
+# else
+	struct stat64 buf64;
+	int r = INLINE_SYSCALL_CALL (fstat64, fd, &buf64);
+	return r ?: __xstat32_conv (vers, &buf64, buf);
 #endif
+      }
+    }
 }
-
 hidden_def (__fxstat)
-weak_alias (__fxstat, _fxstat);
-#if XSTAT_IS_XSTAT64
-#undef __fxstat64
-strong_alias (__fxstat, __fxstat64);
-hidden_ver (__fxstat, __fxstat64)
-#endif
+#endif /* XSTAT_IS_XSTAT64  */