(root)/
strace-6.5/
src/
fetch_struct_statfs.c
       1  /*
       2   * Copyright (c) 2014-2016 Dmitry V. Levin <ldv@strace.io>
       3   * Copyright (c) 2016-2021 The strace developers.
       4   * All rights reserved.
       5   *
       6   * SPDX-License-Identifier: LGPL-2.1-or-later
       7   */
       8  
       9  #include "defs.h"
      10  
      11  #include DEF_MPERS_TYPE(struct_statfs)
      12  #include DEF_MPERS_TYPE(struct_statfs64)
      13  
      14  #include <linux/types.h>
      15  #include <asm/statfs.h>
      16  typedef struct statfs struct_statfs;
      17  typedef struct statfs64 struct_statfs64;
      18  
      19  #include MPERS_DEFS
      20  
      21  #include "statfs.h"
      22  
      23  MPERS_PRINTER_DECL(bool, fetch_struct_statfs,
      24  		   struct tcb *const tcp, const kernel_ulong_t addr,
      25  		   struct strace_statfs *const p)
      26  {
      27  	struct_statfs b;
      28  
      29  	if (umove_or_printaddr(tcp, addr, &b))
      30  		return false;
      31  
      32  	p->f_type = zero_extend_signed_to_ull(b.f_type);
      33  	p->f_bsize = zero_extend_signed_to_ull(b.f_bsize);
      34  	p->f_blocks = zero_extend_signed_to_ull(b.f_blocks);
      35  	p->f_bfree = zero_extend_signed_to_ull(b.f_bfree);
      36  	p->f_bavail = zero_extend_signed_to_ull(b.f_bavail);
      37  	p->f_files = zero_extend_signed_to_ull(b.f_files);
      38  	p->f_ffree = zero_extend_signed_to_ull(b.f_ffree);
      39  #if defined HAVE_STRUCT_STATFS_F_FSID_VAL
      40  	p->f_fsid.val[0] = zero_extend_signed_to_ull(b.f_fsid.val[0]);
      41  	p->f_fsid.val[1] = zero_extend_signed_to_ull(b.f_fsid.val[1]);
      42  #elif defined HAVE_STRUCT_STATFS_F_FSID___VAL
      43  	p->f_fsid.val[0] = zero_extend_signed_to_ull(b.f_fsid.__val[0]);
      44  	p->f_fsid.val[1] = zero_extend_signed_to_ull(b.f_fsid.__val[1]);
      45  #endif
      46  	p->f_namelen = zero_extend_signed_to_ull(b.f_namelen);
      47  #ifdef HAVE_STRUCT_STATFS_F_FRSIZE
      48  	p->f_frsize = zero_extend_signed_to_ull(b.f_frsize);
      49  #endif
      50  #ifdef HAVE_STRUCT_STATFS_F_FLAGS
      51  	p->f_flags = zero_extend_signed_to_ull(b.f_flags);
      52  #endif
      53  
      54  	return true;
      55  }
      56  
      57  #if defined ARM || (defined AARCH64 && defined IN_MPERS)
      58  /* See arch/arm/kernel/sys_oabi-compat.c for details. */
      59  # define COMPAT_STATFS64_PADDED_SIZE (sizeof(struct_statfs64) + 4)
      60  #endif
      61  
      62  MPERS_PRINTER_DECL(bool, fetch_struct_statfs64,
      63  		   struct tcb *const tcp, const kernel_ulong_t addr,
      64  		   const kernel_ulong_t size, struct strace_statfs *const p)
      65  {
      66  	struct_statfs64 b;
      67  
      68  	if (sizeof(b) != size
      69  #ifdef COMPAT_STATFS64_PADDED_SIZE
      70  	    && sizeof(b) != COMPAT_STATFS64_PADDED_SIZE
      71  #endif
      72  	   ) {
      73  		printaddr(addr);
      74  		return false;
      75  	}
      76  
      77  	if (umove_or_printaddr(tcp, addr, &b))
      78  		return false;
      79  
      80  	p->f_type = zero_extend_signed_to_ull(b.f_type);
      81  	p->f_bsize = zero_extend_signed_to_ull(b.f_bsize);
      82  	p->f_blocks = zero_extend_signed_to_ull(b.f_blocks);
      83  	p->f_bfree = zero_extend_signed_to_ull(b.f_bfree);
      84  	p->f_bavail = zero_extend_signed_to_ull(b.f_bavail);
      85  	p->f_files = zero_extend_signed_to_ull(b.f_files);
      86  	p->f_ffree = zero_extend_signed_to_ull(b.f_ffree);
      87  #if defined HAVE_STRUCT_STATFS64_F_FSID_VAL
      88  	p->f_fsid.val[0] = zero_extend_signed_to_ull(b.f_fsid.val[0]);
      89  	p->f_fsid.val[1] = zero_extend_signed_to_ull(b.f_fsid.val[1]);
      90  #elif defined HAVE_STRUCT_STATFS64_F_FSID___VAL
      91  	p->f_fsid.val[0] = zero_extend_signed_to_ull(b.f_fsid.__val[0]);
      92  	p->f_fsid.val[1] = zero_extend_signed_to_ull(b.f_fsid.__val[1]);
      93  #endif
      94  	p->f_namelen = zero_extend_signed_to_ull(b.f_namelen);
      95  #ifdef HAVE_STRUCT_STATFS64_F_FRSIZE
      96  	p->f_frsize = zero_extend_signed_to_ull(b.f_frsize);
      97  #endif
      98  #ifdef HAVE_STRUCT_STATFS64_F_FLAGS
      99  	p->f_flags = zero_extend_signed_to_ull(b.f_flags);
     100  #endif
     101  
     102  	return true;
     103  }