1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26/*	Copyright (c) 1990, 1991 UNIX System Laboratories, Inc.	*/
27/*	Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T	*/
28/*	All Rights Reserved	*/
29
30#ifndef _SYS_STAT_H
31#define	_SYS_STAT_H
32
33#include <sys/feature_tests.h>
34#include <sys/types.h>
35
36#ifdef	__cplusplus
37extern "C" {
38#endif
39
40/*
41 * The implementation specific header <sys/time_impl.h> includes a
42 * definition for timestruc_t needed by the stat structure.  However,
43 * including either <time.h>, which includes <sys/time_impl.h>, or
44 * including <sys/time_impl.h> directly will break both X/Open and
45 * POSIX namespace. Preceeding tag, structure, and structure member
46 * names with underscores eliminates the namespace breakage and at the
47 * same time, with unique type names, eliminates the possibility of
48 * timespec_t or timestruct_t naming conflicts that could otherwise
49 * result based on the order of inclusion of <sys/stat.h> and
50 * <sys/time.h>.  The header <sys/time_std_impl.h> contains the
51 * standards namespace safe versions of these definitions.
52 */
53#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
54#include <sys/time_impl.h>
55#else
56#include <sys/time_std_impl.h>
57#endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
58
59#define	_ST_FSTYPSZ 16		/* array size for file system type name */
60
61/*
62 * stat structure, used by stat(2) and fstat(2)
63 */
64
65#if defined(_KERNEL)
66
67	/* Expanded stat structure */
68
69#if defined(_LP64)
70
71struct stat {
72	dev_t		st_dev;
73	ino_t		st_ino;
74	mode_t		st_mode;
75	nlink_t		st_nlink;
76	uid_t		st_uid;
77	gid_t		st_gid;
78	dev_t		st_rdev;
79	off_t		st_size;
80	timestruc_t	st_atim;
81	timestruc_t	st_mtim;
82	timestruc_t	st_ctim;
83	blksize_t	st_blksize;
84	blkcnt_t	st_blocks;
85	char		st_fstype[_ST_FSTYPSZ];
86};
87
88struct stat64 {
89	dev_t		st_dev;
90	ino_t		st_ino;
91	mode_t		st_mode;
92	nlink_t		st_nlink;
93	uid_t		st_uid;
94	gid_t		st_gid;
95	dev_t		st_rdev;
96	off_t		st_size;
97	timestruc_t	st_atim;
98	timestruc_t	st_mtim;
99	timestruc_t	st_ctim;
100	blksize_t	st_blksize;
101	blkcnt_t	st_blocks;
102	char		st_fstype[_ST_FSTYPSZ];
103};
104
105#else	/* _LP64 */
106
107struct	stat {
108	dev_t		st_dev;
109	long		st_pad1[3];	/* reserve for dev expansion, */
110					/* sysid definition */
111	ino_t		st_ino;
112	mode_t		st_mode;
113	nlink_t		st_nlink;
114	uid_t		st_uid;
115	gid_t		st_gid;
116	dev_t		st_rdev;
117	long		st_pad2[2];
118	off_t		st_size;
119	long		st_pad3;	/* pad for future off_t expansion */
120	timestruc_t	st_atim;
121	timestruc_t	st_mtim;
122	timestruc_t	st_ctim;
123	blksize_t	st_blksize;
124	blkcnt_t	st_blocks;
125	char		st_fstype[_ST_FSTYPSZ];
126	long		st_pad4[8];	/* expansion area */
127};
128
129struct  stat64 {
130	dev_t		st_dev;
131	long		st_pad1[3];	/* reserve for dev expansion, */
132				/* sysid definition */
133	ino64_t		st_ino;
134	mode_t		st_mode;
135	nlink_t		st_nlink;
136	uid_t		st_uid;
137	gid_t		st_gid;
138	dev_t		st_rdev;
139	long		st_pad2[2];
140	off64_t		st_size;	/* large file support */
141	timestruc_t	st_atim;
142	timestruc_t	st_mtim;
143	timestruc_t	st_ctim;
144	blksize_t	st_blksize;
145	blkcnt64_t	st_blocks;	/* large file support */
146	char		st_fstype[_ST_FSTYPSZ];
147	long		st_pad4[8];	/* expansion area */
148};
149
150#endif	/* _LP64 */
151
152#else /* !defined(_KERNEL) */
153
154/*
155 * large file compilation environment setup
156 */
157#if !defined(_LP64) && _FILE_OFFSET_BITS == 64
158#ifdef	__PRAGMA_REDEFINE_EXTNAME
159#pragma redefine_extname	fstat	fstat64
160#pragma redefine_extname	stat	stat64
161#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
162	defined(_ATFILE_SOURCE)
163#pragma	redefine_extname	fstatat	fstatat64
164#endif /* defined (_ATFILE_SOURCE) */
165
166#if !defined(__XOPEN_OR_POSIX) || defined(_XPG_2) || defined(__EXTENSIONS__)
167#pragma	redefine_extname	lstat	lstat64
168#endif
169#else	/* __PRAGMA_REDEFINE_EXTNAME */
170#define	fstat	fstat64
171#define	stat	stat64
172#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
173	defined(_ATFILE_SOURCE)
174#define	fstatat	fstatat64
175#endif /* defined (_ATFILE_SOURCE) */
176#if !defined(__XOPEN_OR_POSIX) || defined(_XPG_2) || defined(__EXTENSIONS__)
177#define	lstat	lstat64
178#endif
179#endif	/* __PRAGMA_REDEFINE_EXTNAME */
180#endif	/* !_LP64 && _FILE_OFFSET_BITS == 64 */
181
182/*
183 * In the LP64 compilation environment, map large file interfaces
184 * back to native versions where possible.
185 */
186#if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
187#ifdef	__PRAGMA_REDEFINE_EXTNAME
188#pragma	redefine_extname	fstat64	fstat
189#pragma	redefine_extname	stat64	stat
190#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
191	defined(_ATFILE_SOURCE)
192#pragma	redefine_extname	fstatat64 fstatat
193#endif /* defined (_ATFILE_SOURCE) */
194#if !defined(__XOPEN_OR_POSIX) || defined(_XPG_2) || defined(__EXTENSIONS__)
195#pragma	redefine_extname	lstat64	lstat
196#endif
197#else	/* __PRAGMA_REDEFINE_EXTNAME */
198#define	fstat64	fstat
199#define	stat64	stat
200#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
201	defined(_ATFILE_SOURCE)
202#define	fstatat64	fstatat
203#endif /* defined (_ATFILE_SOURCE) */
204#if !defined(__XOPEN_OR_POSIX) || defined(_XPG_2) || defined(__EXTENSIONS__)
205#define	lstat64	lstat
206#endif
207#endif	/* __PRAGMA_REDEFINE_EXTNAME */
208#endif	/* _LP64 && _LARGEFILE64_SOURCE */
209
210/*
211 * User level stat structure definitions.
212 */
213
214#if defined(_LP64)
215
216struct stat {
217	dev_t		st_dev;
218	ino_t		st_ino;
219	mode_t		st_mode;
220	nlink_t		st_nlink;
221	uid_t		st_uid;
222	gid_t		st_gid;
223	dev_t		st_rdev;
224	off_t		st_size;
225#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
226	timestruc_t	st_atim;
227	timestruc_t	st_mtim;
228	timestruc_t	st_ctim;
229#else
230	_timestruc_t	st_atim;
231	_timestruc_t	st_mtim;
232	_timestruc_t	st_ctim;
233#endif
234	blksize_t	st_blksize;
235	blkcnt_t	st_blocks;
236	char		st_fstype[_ST_FSTYPSZ];
237};
238
239#else	/* _LP64 */
240
241struct	stat {
242	dev_t		st_dev;
243	long		st_pad1[3];	/* reserved for network id */
244	ino_t		st_ino;
245	mode_t		st_mode;
246	nlink_t		st_nlink;
247	uid_t		st_uid;
248	gid_t		st_gid;
249	dev_t		st_rdev;
250	long		st_pad2[2];
251	off_t		st_size;
252#if _FILE_OFFSET_BITS != 64
253	long		st_pad3;	/* future off_t expansion */
254#endif
255#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
256	timestruc_t	st_atim;
257	timestruc_t	st_mtim;
258	timestruc_t	st_ctim;
259#else
260	_timestruc_t	st_atim;
261	_timestruc_t	st_mtim;
262	_timestruc_t	st_ctim;
263#endif
264	blksize_t	st_blksize;
265	blkcnt_t	st_blocks;
266	char		st_fstype[_ST_FSTYPSZ];
267	long		st_pad4[8];	/* expansion area */
268};
269
270#endif	/* _LP64 */
271
272/* transitional large file interface version */
273#if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
274	    !defined(__PRAGMA_REDEFINE_EXTNAME))
275#if defined(_LP64)
276
277struct stat64 {
278	dev_t		st_dev;
279	ino_t		st_ino;
280	mode_t		st_mode;
281	nlink_t		st_nlink;
282	uid_t		st_uid;
283	gid_t		st_gid;
284	dev_t		st_rdev;
285	off_t		st_size;
286#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
287	timestruc_t	st_atim;
288	timestruc_t	st_mtim;
289	timestruc_t	st_ctim;
290#else
291	_timestruc_t	st_atim;
292	_timestruc_t	st_mtim;
293	_timestruc_t	st_ctim;
294#endif
295	blksize_t	st_blksize;
296	blkcnt_t	st_blocks;
297	char		st_fstype[_ST_FSTYPSZ];
298};
299
300#else	/* _LP64 */
301
302struct	stat64 {
303	dev_t		st_dev;
304	long		st_pad1[3];	/* reserved for network id */
305	ino64_t		st_ino;
306	mode_t		st_mode;
307	nlink_t		st_nlink;
308	uid_t		st_uid;
309	gid_t		st_gid;
310	dev_t		st_rdev;
311	long		st_pad2[2];
312	off64_t		st_size;
313#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
314	timestruc_t	st_atim;
315	timestruc_t	st_mtim;
316	timestruc_t	st_ctim;
317#else
318	_timestruc_t    st_atim;
319	_timestruc_t    st_mtim;
320	_timestruc_t    st_ctim;
321#endif
322	blksize_t	st_blksize;
323	blkcnt64_t	st_blocks;
324	char		st_fstype[_ST_FSTYPSZ];
325	long		st_pad4[8];	/* expansion area */
326};
327
328#endif	/* _LP64 */
329#endif
330
331#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
332#define	st_atime	st_atim.tv_sec
333#define	st_mtime	st_mtim.tv_sec
334#define	st_ctime	st_ctim.tv_sec
335#else
336#define	st_atime	st_atim.__tv_sec
337#define	st_mtime	st_mtim.__tv_sec
338#define	st_ctime	st_ctim.__tv_sec
339#endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
340
341#endif /* end defined(_KERNEL) */
342
343#if defined(_SYSCALL32)
344
345/*
346 * Kernel's view of user ILP32 stat and stat64 structures
347 */
348
349struct stat32 {
350	dev32_t		st_dev;
351	int32_t		st_pad1[3];
352	ino32_t		st_ino;
353	mode32_t	st_mode;
354	nlink32_t	st_nlink;
355	uid32_t		st_uid;
356	gid32_t		st_gid;
357	dev32_t		st_rdev;
358	int32_t		st_pad2[2];
359	off32_t		st_size;
360	int32_t		st_pad3;
361	timestruc32_t	st_atim;
362	timestruc32_t	st_mtim;
363	timestruc32_t	st_ctim;
364	int32_t		st_blksize;
365	blkcnt32_t	st_blocks;
366	char		st_fstype[_ST_FSTYPSZ];
367	int32_t		st_pad4[8];
368};
369
370#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
371#pragma pack(4)
372#endif
373
374struct stat64_32 {
375	dev32_t		st_dev;
376	int32_t		st_pad1[3];
377	ino64_t		st_ino;
378	mode32_t	st_mode;
379	nlink32_t	st_nlink;
380	uid32_t		st_uid;
381	gid32_t		st_gid;
382	dev32_t		st_rdev;
383	int32_t		st_pad2[2];
384	off64_t		st_size;
385	timestruc32_t	st_atim;
386	timestruc32_t	st_mtim;
387	timestruc32_t	st_ctim;
388	int32_t		st_blksize;
389	blkcnt64_t	st_blocks;
390	char		st_fstype[_ST_FSTYPSZ];
391	int32_t		st_pad4[8];
392};
393
394#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
395#pragma pack()
396#endif
397
398#endif	/* _SYSCALL32 */
399
400/* MODE MASKS */
401
402/* de facto standard definitions */
403
404#define	S_IFMT		0xF000	/* type of file */
405#define	S_IAMB		0x1FF	/* access mode bits */
406#define	S_IFIFO		0x1000	/* fifo */
407#define	S_IFCHR		0x2000	/* character special */
408#define	S_IFDIR		0x4000	/* directory */
409/* XENIX definitions are not relevant to Solaris */
410#define	S_IFNAM		0x5000  /* XENIX special named file */
411#define	S_INSEM		0x1	/* XENIX semaphore subtype of IFNAM */
412#define	S_INSHD		0x2	/* XENIX shared data subtype of IFNAM */
413#define	S_IFBLK		0x6000	/* block special */
414#define	S_IFREG		0x8000	/* regular */
415#define	S_IFLNK		0xA000	/* symbolic link */
416#define	S_IFSOCK	0xC000	/* socket */
417#define	S_IFDOOR	0xD000	/* door */
418#define	S_IFPORT	0xE000	/* event port */
419#define	S_ISUID		0x800	/* set user id on execution */
420#define	S_ISGID		0x400	/* set group id on execution */
421#define	S_ISVTX		0x200	/* save swapped text even after use */
422#define	S_IREAD		00400	/* read permission, owner */
423#define	S_IWRITE	00200	/* write permission, owner */
424#define	S_IEXEC		00100	/* execute/search permission, owner */
425#define	S_ENFMT		S_ISGID	/* record locking enforcement flag */
426
427/* the following macros are for POSIX conformance */
428
429#define	S_IRWXU		00700	/* read, write, execute: owner */
430#define	S_IRUSR		00400	/* read permission: owner */
431#define	S_IWUSR		00200	/* write permission: owner */
432#define	S_IXUSR		00100	/* execute permission: owner */
433#define	S_IRWXG		00070	/* read, write, execute: group */
434#define	S_IRGRP		00040	/* read permission: group */
435#define	S_IWGRP		00020	/* write permission: group */
436#define	S_IXGRP		00010	/* execute permission: group */
437#define	S_IRWXO		00007	/* read, write, execute: other */
438#define	S_IROTH		00004	/* read permission: other */
439#define	S_IWOTH		00002	/* write permission: other */
440#define	S_IXOTH		00001	/* execute permission: other */
441
442
443#define	S_ISFIFO(mode)	(((mode)&0xF000) == 0x1000)
444#define	S_ISCHR(mode)	(((mode)&0xF000) == 0x2000)
445#define	S_ISDIR(mode)	(((mode)&0xF000) == 0x4000)
446#define	S_ISBLK(mode)	(((mode)&0xF000) == 0x6000)
447#define	S_ISREG(mode)	(((mode)&0xF000) == 0x8000)
448#define	S_ISLNK(mode)	(((mode)&0xF000) == 0xa000)
449#define	S_ISSOCK(mode)	(((mode)&0xF000) == 0xc000)
450#define	S_ISDOOR(mode)	(((mode)&0xF000) == 0xd000)
451#define	S_ISPORT(mode)	(((mode)&0xF000) == 0xe000)
452
453/* POSIX.4 macros */
454#define	S_TYPEISMQ(_buf)	(0)
455#define	S_TYPEISSEM(_buf)	(0)
456#define	S_TYPEISSHM(_buf)	(0)
457
458#if defined(__i386) || (defined(__i386_COMPAT) && defined(_KERNEL))
459
460/*
461 * A version number is included in the x86 SVR4 stat and mknod interfaces
462 * so that SVR4 binaries can be supported.  An LP64 kernel that supports
463 * the i386 ABI need to be aware of this too.
464 */
465
466#define	_R3_MKNOD_VER	1	/* SVR3.0 mknod */
467#define	_MKNOD_VER	2	/* current version of mknod */
468#define	_R3_STAT_VER	1	/* SVR3.0 stat */
469#define	_STAT_VER	2	/* current version of stat */
470
471#endif	/* __i386 || (__i386_COMPAT && _KERNEL) */
472
473#if defined(__EXTENSIONS__) || \
474	(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
475	/* || defined(_XPG7) */
476/* for use with futimens() and utimensat() */
477#define	UTIME_NOW	-1L
478#define	UTIME_OMIT	-2L
479#endif	/* defined(__EXTENSIONS__) ... */
480
481#if !defined(_KERNEL) || defined(_BOOT)
482
483#if defined(__STDC__)
484
485#if !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE > 2) || \
486	defined(_XPG4_2) || defined(__EXTENSIONS__)
487extern int fchmod(int, mode_t);
488#endif /* !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE > 2)... */
489
490extern int chmod(const char *, mode_t);
491extern int mkdir(const char *, mode_t);
492extern int mkfifo(const char *, mode_t);
493extern mode_t umask(mode_t);
494
495/* transitional large file interfaces */
496#if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
497	    !defined(__PRAGMA_REDEFINE_EXTNAME))
498extern int fstat64(int, struct stat64 *);
499extern int stat64(const char *_RESTRICT_KYWD, struct stat64 *_RESTRICT_KYWD);
500extern int lstat64(const char *_RESTRICT_KYWD, struct stat64 *_RESTRICT_KYWD);
501#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
502	defined(_ATFILE_SOURCE)
503extern int fstatat64(int, const char *, struct stat64 *, int);
504#endif /* defined (_ATFILE_SOURCE) */
505#endif
506
507#if defined(__EXTENSIONS__) || defined(_ATFILE_SOURCE) || \
508	(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
509	/* || defined(_XPG7) */
510extern int mkdirat(int, const char *, mode_t);
511extern int mkfifoat(int, const char *, mode_t);
512extern int mknodat(int, const char *, mode_t, dev_t);
513extern int fchmodat(int, const char *, mode_t, int);
514extern int futimens(int, const struct timespec[2]);
515extern int utimensat(int, const char *, const struct timespec[2], int);
516#endif	/* defined(__EXTENSIONS__) ... */
517
518#else /* !__STDC__ */
519
520#if !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE > 2) || \
521	defined(_XPG4_2) || defined(__EXTENSIONS__)
522extern int fchmod();
523#endif /* !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE > 2)... */
524
525extern int chmod();
526extern int mkdir();
527extern int mkfifo();
528extern mode_t umask();
529
530/* transitional large file interfaces */
531#if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
532	    !defined(__PRAGMA_REDEFINE_EXTNAME))
533extern int fstat64();
534extern int stat64();
535extern int lstat64();
536#if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
537	defined(_ATFILE_SOURCE)
538extern int fstatat64();
539#endif /* defined (_ATFILE_SOURCE) */
540#endif
541
542#if defined(__EXTENSIONS__) || defined(_ATFILE_SOURCE) || \
543	(!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
544	/* || defined(_XPG7) */
545extern int mkdirat();
546extern int mkfifoat();
547extern int mknodat();
548extern int fchmodat();
549extern int futimens();
550extern int utimensat();
551#endif	/* defined(__EXTENSIONS__) ... */
552
553#endif /* defined(__STDC__) */
554
555#include <sys/stat_impl.h>
556
557#endif /* !defined(_KERNEL) */
558
559#ifdef	__cplusplus
560}
561#endif
562
563#endif	/* _SYS_STAT_H */
564