master
  1/* Get file status.  Linux version.
  2   Copyright (C) 2020-2025 Free Software Foundation, Inc.
  3   This file is part of the GNU C Library.
  4
  5   The GNU C Library is free software; you can redistribute it and/or
  6   modify it under the terms of the GNU Lesser General Public
  7   License as published by the Free Software Foundation; either
  8   version 2.1 of the License, or (at your option) any later version.
  9
 10   The GNU C Library is distributed in the hope that it will be useful,
 11   but WITHOUT ANY WARRANTY; without even the implied warranty of
 12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 13   Lesser General Public License for more details.
 14
 15   You should have received a copy of the GNU Lesser General Public
 16   License along with the GNU C Library; if not, see
 17   <https://www.gnu.org/licenses/>.  */
 18
 19#define __fstat __redirect___fstat
 20#define fstat   __redirect_fstat
 21#include <sys/stat.h>
 22#undef __fstat
 23#undef fstat
 24#include <fcntl.h>
 25#include <internal-stat.h>
 26#include <errno.h>
 27
 28int
 29__fstat64_time64 (int fd, struct __stat64_t64 *buf)
 30{
 31#if !FSTATAT_USE_STATX
 32# if XSTAT_IS_XSTAT64
 33  /* The __NR_stat macro is defined for all ABIs that also define
 34     XSTAT_IS_STAT64, so to correctly identify alpha and sparc check
 35     __NR_newfstatat (similar to what fstatat64 does).  */
 36#  ifdef __NR_newfstatat
 37  /* 64-bit kABI, e.g. aarch64, ia64, powerpc64*, s390x, riscv64, and
 38     x86_64.  */
 39  return INLINE_SYSCALL_CALL (fstat, fd, buf);
 40#  elif defined __NR_fstat64
 41#   if STAT64_IS_KERNEL_STAT64
 42  /* 64-bit kABI outlier, e.g. alpha  */
 43  return INLINE_SYSCALL_CALL (fstat64, fd, buf);
 44#   else
 45  /* 64-bit kABI outlier, e.g. sparc64.  */
 46  struct kernel_stat64 kst64;
 47  int r = INLINE_SYSCALL_CALL (fstat64, fd, &kst64);
 48  if (r == 0)
 49    __cp_stat64_kstat64 (buf, &kst64);
 50  return r;
 51#   endif /* STAT64_IS_KERNEL_STAT64 */
 52#  endif
 53# else /* XSTAT_IS_XSTAT64 */
 54  /* 64-bit kabi outlier, e.g. mips64 and mips64-n32.  */
 55  struct kernel_stat kst;
 56  int r = INLINE_SYSCALL_CALL (fstat, fd, &kst);
 57  if (r == 0)
 58    __cp_kstat_stat64_t64 (&kst, buf);
 59  return r;
 60# endif
 61#else /* !FSTATAT_USE_STATX  */
 62  /* All kABIs with non-LFS support and with old 32-bit time_t support
 63     e.g. arm, csky, i386, hppa, m68k, microblaze, sh, powerpc32,
 64     and sparc32.  */
 65  if (fd < 0)
 66    {
 67      __set_errno (EBADF);
 68      return -1;
 69    }
 70  return __fstatat64_time64 (fd, "", buf, AT_EMPTY_PATH);
 71#endif
 72}
 73#if __TIMESIZE != 64
 74hidden_def (__fstat64_time64)
 75
 76int
 77__fstat64 (int fd, struct stat64 *buf)
 78{
 79  if (fd < 0)
 80    {
 81      __set_errno (EBADF);
 82      return -1;
 83    }
 84
 85  struct __stat64_t64 st_t64;
 86  return __fstat64_time64 (fd, &st_t64)
 87	 ?: __cp_stat64_t64_stat64 (&st_t64, buf);
 88}
 89#endif
 90
 91#undef __fstat
 92#undef fstat
 93
 94hidden_def (__fstat64)
 95weak_alias (__fstat64, fstat64)
 96
 97#if XSTAT_IS_XSTAT64
 98strong_alias (__fstat64, __fstat)
 99weak_alias (__fstat64, fstat)
100#endif