Lots of magic
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / bits / stat.h
1 /* Copyright (C) 1993, 96, 97, 98, 99, 2000, 2008
2     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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #ifndef _SYS_STAT_H
21 # error "Never include <bits/stat.h> directly; use <sys/stat.h> instead."
22 #endif
23
24 #include <bits/wordsize.h>
25
26 /* Length of array allocated for file system type name.  */
27 #define _ST_FSTYPSZ     16
28
29 /* Structure describing file characteristics.  */
30 struct stat
31   {
32     __dev_t st_dev;
33 #if __WORDSIZE == 32
34     long int st_pad1[3];
35 #endif
36 #ifndef __USE_FILE_OFFSET64
37     __ino_t st_ino;             /* File serial number.          */
38 #else
39     __ino64_t st_ino;           /* 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 #if __WORDSIZE == 32
47     long int st_pad2[2];
48 #endif
49 #ifndef __USE_FILE_OFFSET64
50     __off_t st_size;            /* Size of file, in bytes.  */
51 #else
52     __off64_t st_size;          /* Size of file, in bytes.  */
53 #endif
54 #if __WORDSIZE == 32 && !defined(__USE_FILE_OFFSET64)
55     long int st_pad3;
56 #endif
57 #ifdef __USE_MISC
58     struct timespec st_atim;            /* Time of last access.  */
59     struct timespec st_mtim;            /* Time of last modification.  */
60     struct timespec st_ctim;            /* Time of last status change.  */
61 # define st_atime st_atim.tv_sec        /* Backward compatibility.  */
62 # define st_mtime st_mtim.tv_sec
63 # define st_ctime st_ctim.tv_sec
64 #else
65     __time_t st_atime;          /* Time of last access.  */
66     unsigned long int st_atime_usec;
67     __time_t st_mtime;          /* Time of last modification.  */
68     unsigned long int st_mtime_usec;
69     __time_t st_ctime;          /* Time of last status change.  */
70     unsigned long int st_ctime_usec;
71 #endif
72     __blksize_t st_blksize;     /* Optimal block size for I/O.  */
73 #define _STATBUF_ST_BLKSIZE     /* Tell code we have this member.  */
74
75 #ifndef __USE_FILE_OFFSET64
76     __blkcnt_t st_blocks;       /* Number of 512-byte blocks allocated.  */
77 #else
78     __blkcnt64_t st_blocks;     /* Number of 512-byte blocks allocated.  */
79 #endif
80     char st_fstype[_ST_FSTYPSZ];
81 #if __WORDSIZE == 32
82     long int st_pad4[8];
83 #endif
84   };
85
86 #ifdef _SYSCALL32
87 #include <sys/types32.h>
88
89 struct stat32
90   {
91         __dev_t st_dev;
92         __int32_t st_pad1[3];
93         __ino_t st_ino;
94         __mode_t st_mode;
95         __nlink_t st_nlink;
96         __uid_t st_uid;
97         __gid_t st_gid;
98         __dev_t st_rdev;
99         __int32_t st_pad2[2];
100         __off_t st_size;
101         __int32_t st_pad3;
102         struct timespec32 st_atim;
103         struct timespec32 st_mtim;
104         struct timespec32 st_ctim;
105         __int32_t st_blksize;
106         __blkcnt_t st_blocks;
107         char st_fstype[_ST_FSTYPSZ];
108         __int32_t st_pad4[8];
109   };
110 #endif /* _SYSCALL32 */
111
112 #ifdef __USE_LARGEFILE64
113 /* struct stat64 has the shape as stat */
114 struct stat64
115   {
116     __dev_t st_dev;                     /* Device */
117 #if __WORDSIZE == 32
118     long int st_pad1[3];
119 #endif
120     __ino64_t st_ino;                   /* File serial number */
121     __mode_t st_mode;                   /* File mode */
122     __nlink_t st_nlink;                 /* Link count */
123     __uid_t st_uid;                             /* User ID of the file's owner. */
124     __gid_t st_gid;                             /* Group ID of the file's group.*/
125     __dev_t st_rdev;                    /* Device number, if device */
126 #if __WORDSIZE == 32
127     long int st_pad2[2];
128 #endif
129     __off64_t st_size;                  /* Size of file, in bytes. */
130 #ifdef __USE_MISC
131     struct timespec st_atim;            /* Time of last access.  */
132     struct timespec st_mtim;            /* Time of last modification.  */
133     struct timespec st_ctim;            /* Time of last status change.  */
134 # define st_atime st_atim.tv_sec        /* Backward compatibility.  */
135 # define st_mtime st_mtim.tv_sec
136 # define st_ctime st_ctim.tv_sec
137 #else
138     __time_t st_atime;                  /* Time of last access */
139     unsigned long int st_atime_usec;
140     __time_t st_mtime;                  /* Time of last modification */
141     unsigned long int st_mtime_usec;
142     __time_t st_ctime;                  /* Time of last status change */
143     unsigned long int st_ctime_usec;
144 #endif
145     __blksize_t st_blksize;
146     __blkcnt64_t st_blocks;
147     char st_fstype[_ST_FSTYPSZ];
148 #if __WORDSIZE == 32
149     long int st_pad4[8];
150 #endif
151 };
152 #endif
153
154 #ifdef _SYSCALL32
155
156 #include <sys/isa_defs.h>
157
158 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
159 # pragma pack(4)
160 #endif
161
162 struct stat64_32
163   {
164         dev32_t st_dev;
165         int32_t st_pad1[3];
166         ino64_t st_ino;
167         mode32_t st_mode;
168         nlink32_t st_nlink;
169         uid32_t st_uid;
170         gid32_t st_gid;
171         dev32_t st_rdev;
172         int32_t st_pad2[2];
173         off64_t st_size;
174         struct timespec32 st_atim;
175         struct timespec32 st_mtim;
176         struct timespec32 st_ctim;
177         int32_t st_blksize;
178         blkcnt64_t st_blocks;
179         char st_fstype[_ST_FSTYPSZ];
180         int32_t st_pad4[8];
181   };
182
183 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
184 # pragma pack()
185 #endif
186
187 #endif /* _SYSCALL32 */
188
189 /* Tell code we have these members.  */
190 #define _STATBUF_ST_BLKSIZE
191 #define _STATBUF_ST_RDEV
192
193 /* Encoding of the file mode.  */
194
195 #define __S_IFMT        0xF000  /* These bits determine file type.  */
196
197 /* File types.  */
198 #define __S_IFDIR       0x4000  /* Directory.  */
199 #define __S_IFCHR       0x2000  /* Character device.  */
200 #define __S_IFBLK       0x6000  /* Block device.  */
201 #define __S_IFREG       0x8000  /* Regular file.  */
202 #define __S_IFIFO       0x1000  /* FIFO.  */
203 #define __S_IFLNK       0xA000  /* Symbolic link.  */
204 #define __S_IFSOCK      0xC000  /* Socket.  */
205 #define   S_IFDOOR      0xD000  /* Door.        */
206 #define   S_IFPORT      0xE000  /* Event port.  */
207
208 /* POSIX.1b objects.  */
209 #define __S_TYPEISMQ(buf) (0)
210 #define __S_TYPEISSEM(buf) (0)
211 #define __S_TYPEISSHM(buf) (0)
212
213 /* Protection bits.  */
214
215 #define __S_ISUID       0x800   /* Set user ID on execution.  */
216 #define __S_ISGID       0x400   /* Set group ID on execution.  */
217 #define __S_ISVTX       0x200   /* Save swapped text after use (sticky).  */
218 #define __S_IREAD       00400   /* Read by owner.  */
219 #define __S_IWRITE      00200   /* Write by owner.  */
220 #define __S_IEXEC       00100   /* Execute by owner.  */
221
222 #define _R3_MKNOD_VER   1       /* SVR3.0 mknod */
223 #define _MKNOD_VER              2       /* current version of mknod */
224 #define _R3_STAT_VER    1       /* SVR3.0 stat */
225 #define _STAT_VER               2       /* current version of stat */
226
227 #define S_IAMB  0x01FF
228
229 #define S_ISDOOR(mode)  (((mode) & 0xF000) == S_IFDOOR)
230 #define S_ISPORT(mode)  (((mode) & 0xF000) == S_IFPORT)