1 /* Definition for struct stat. 2 Copyright (C) 2020-2021 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 #if !defined _SYS_STAT_H && !defined _FCNTL_H 20 # error "Never include <bits/struct_stat.h> directly; use <sys/stat.h> instead." 21 #endif 22 23 #ifndef _BITS_STRUCT_STAT_H 24 #define _BITS_STRUCT_STAT_H 1 25 26 #include <bits/endian.h> 27 #include <bits/wordsize.h> 28 29 struct stat 30 { 31 #ifdef __USE_TIME_BITS64 32 # include <bits/struct_stat_time64_helper.h> 33 #else 34 __dev_t st_dev; /* Device. */ 35 unsigned short int __pad1; 36 # ifndef __USE_FILE_OFFSET64 37 __ino_t st_ino; /* File serial number. */ 38 # else 39 __ino_t __st_ino; /* 32bit file serial number. */ 40 # endif 41 __mode_t st_mode; /* File mode. */ 42 __nlink_t st_nlink; /* Link count. */ 43 __uid_t st_uid; /* User ID of the file's owner. */ 44 __gid_t st_gid; /* Group ID of the file's group.*/ 45 __dev_t st_rdev; /* Device number, if device. */ 46 unsigned short int __pad2; 47 # ifndef __USE_FILE_OFFSET64 48 __off_t st_size; /* Size of file, in bytes. */ 49 # else 50 __off64_t st_size; /* Size of file, in bytes. */ 51 # endif 52 __blksize_t st_blksize; /* Optimal block size for I/O. */ 53 54 # ifndef __USE_FILE_OFFSET64 55 __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ 56 # else 57 __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ 58 # endif 59 # ifdef __USE_XOPEN2K8 60 /* Nanosecond resolution timestamps are stored in a format 61 equivalent to 'struct timespec'. This is the type used 62 whenever possible but the Unix namespace rules do not allow the 63 identifier 'timespec' to appear in the <sys/stat.h> header. 64 Therefore we have to handle the use of this header in strictly 65 standard-compliant sources special. */ 66 struct timespec st_atim; /* Time of last access. */ 67 struct timespec st_mtim; /* Time of last modification. */ 68 struct timespec st_ctim; /* Time of last status change. */ 69 # define st_atime st_atim.tv_sec /* Backward compatibility. */ 70 # define st_mtime st_mtim.tv_sec 71 # define st_ctime st_ctim.tv_sec 72 # else 73 __time_t st_atime; /* Time of last access. */ 74 unsigned long int st_atimensec; /* Nscecs of last access. */ 75 __time_t st_mtime; /* Time of last modification. */ 76 unsigned long int st_mtimensec; /* Nsecs of last modification. */ 77 __time_t st_ctime; /* Time of last status change. */ 78 unsigned long int st_ctimensec; /* Nsecs of last status change. */ 79 # endif 80 # ifndef __USE_FILE_OFFSET64 81 unsigned long int __glibc_reserved4; 82 unsigned long int __glibc_reserved5; 83 # else 84 __ino64_t st_ino; /* File serial number. */ 85 # endif 86 #endif /* __USE_TIME_BITS64 */ 87 }; 88 89 #ifdef __USE_LARGEFILE64 90 struct stat64 91 { 92 # ifdef __USE_TIME_BITS64 93 # include <bits/struct_stat_time64_helper.h> 94 # else 95 __dev_t st_dev; /* Device. */ 96 unsigned int __pad1; 97 98 __ino_t __st_ino; /* 32bit file serial number. */ 99 __mode_t st_mode; /* File mode. */ 100 __nlink_t st_nlink; /* Link count. */ 101 __uid_t st_uid; /* User ID of the file's owner. */ 102 __gid_t st_gid; /* Group ID of the file's group.*/ 103 __dev_t st_rdev; /* Device number, if device. */ 104 unsigned int __pad2; 105 __off64_t st_size; /* Size of file, in bytes. */ 106 __blksize_t st_blksize; /* Optimal block size for I/O. */ 107 108 __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ 109 # ifdef __USE_XOPEN2K8 110 /* Nanosecond resolution timestamps are stored in a format 111 equivalent to 'struct timespec'. This is the type used 112 whenever possible but the Unix namespace rules do not allow the 113 identifier 'timespec' to appear in the <sys/stat.h> header. 114 Therefore we have to handle the use of this header in strictly 115 standard-compliant sources special. */ 116 struct timespec st_atim; /* Time of last access. */ 117 struct timespec st_mtim; /* Time of last modification. */ 118 struct timespec st_ctim; /* Time of last status change. */ 119 # else 120 __time_t st_atime; /* Time of last access. */ 121 unsigned long int st_atimensec; /* Nscecs of last access. */ 122 __time_t st_mtime; /* Time of last modification. */ 123 unsigned long int st_mtimensec; /* Nsecs of last modification. */ 124 __time_t st_ctime; /* Time of last status change. */ 125 unsigned long int st_ctimensec; /* Nsecs of last status change. */ 126 # endif 127 __ino64_t st_ino; /* File serial number. */ 128 # endif /* __USE_TIME_BITS64 */ 129 }; 130 #endif 131 132 /* Tell code we have these members. */ 133 #define _STATBUF_ST_BLKSIZE 134 #define _STATBUF_ST_RDEV 135 /* Nanosecond resolution time values are supported. */ 136 #define _STATBUF_ST_NSEC 137 138 139 #endif /* _BITS_STRUCT_STAT_H */ 140