(root)/
glibc-2.38/
sysdeps/
unix/
sysv/
linux/
fstatfs.c
       1  /* Get filesystem statistics.  Linux version.
       2     Copyright (C) 2021-2023 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  #include <sys/statfs.h>
      20  #include <time.h>
      21  #include <sysdep.h>
      22  #include <kernel_stat.h>
      23  
      24  #if !STATFS_IS_STATFS64
      25  
      26  /* Return information about the filesystem on which FILE resides.  */
      27  int
      28  __fstatfs (int fd, struct statfs *buf)
      29  {
      30    struct statfs64 buf64;
      31    int rc = INLINE_SYSCALL_CALL (fstatfs64, fd, sizeof (buf64), &buf64);
      32    if (rc != 0)
      33      return rc;
      34  
      35    buf->f_type = buf64.f_type;
      36    buf->f_bsize = buf64.f_bsize;
      37    buf->f_blocks = buf64.f_blocks;
      38    buf->f_bfree = buf64.f_bfree;
      39    buf->f_bavail = buf64.f_bavail;
      40    buf->f_files = buf64.f_files;
      41    buf->f_ffree = buf64.f_ffree;
      42    buf->f_fsid = buf64.f_fsid;
      43    buf->f_namelen = buf64.f_namelen;
      44    buf->f_frsize = buf64.f_frsize;
      45    buf->f_flags = buf64.f_flags;
      46    memcpy (buf->f_spare, buf64.f_spare, sizeof (buf64.f_spare));
      47  
      48    if ((fsblkcnt_t) buf64.f_blocks != buf64.f_blocks
      49        || (fsblkcnt_t) buf64.f_bfree != buf64.f_bfree
      50        || (fsblkcnt_t) buf64.f_bavail != buf64.f_bavail
      51        || (fsblkcnt_t) buf64.f_files != buf64.f_files
      52        || (fsblkcnt_t) buf64.f_ffree != buf64.f_ffree)
      53     {
      54       __set_errno (EOVERFLOW);
      55       return -1;
      56     }
      57  
      58    return 0;
      59  }
      60  libc_hidden_def (__fstatfs)
      61  weak_alias (__fstatfs, fstatfs)
      62  #endif