summary refs log tree commit diff
path: root/io/sys/stat.h
blob: 5485976ca64b38b21b1eecfc3f2f9354fd53ae1c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public
   License along with the GNU C Library; see the file COPYING.LIB.  If not,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

/*
 *	POSIX Standard: 5.6 File Characteristics	<sys/stat.h>
 */

#ifndef	_SYS_STAT_H
#define	_SYS_STAT_H	1

#include <features.h>

#include <bits/types.h>		/* For __mode_t and __dev_t.  */

__BEGIN_DECLS

#include <bits/stat.h>

#if defined(__USE_BSD) || defined(__USE_MISC)
#define	S_IFMT		__S_IFMT
#define	S_IFDIR		__S_IFDIR
#define	S_IFCHR		__S_IFCHR
#define	S_IFBLK		__S_IFBLK
#define	S_IFREG		__S_IFREG
#ifdef __S_IFLNK
#define	S_IFLNK		__S_IFLNK
#endif
#ifdef __S_IFSOCK
#define	S_IFSOCK	__S_IFSOCK
#endif
#ifdef __S_IFIFO
#define	S_IFIFO		__S_IFIFO
#endif
#endif

/* Test macros for file types.	*/

#define	__S_ISTYPE(mode, mask)	(((mode) & __S_IFMT) == (mask))

#define	S_ISDIR(mode)	__S_ISTYPE((mode), __S_IFDIR)
#define	S_ISCHR(mode)	__S_ISTYPE((mode), __S_IFCHR)
#define	S_ISBLK(mode)	__S_ISTYPE((mode), __S_IFBLK)
#define	S_ISREG(mode)	__S_ISTYPE((mode), __S_IFREG)
#ifdef __S_IFIFO
#define	S_ISFIFO(mode)	__S_ISTYPE((mode), __S_IFIFO)
#endif

#ifdef	__USE_BSD
#ifdef __S_IFLNK
#define	S_ISLNK(mode)	__S_ISTYPE((mode), __S_IFLNK)
#endif
#ifdef __S_IFSOCK
#define	S_ISSOCK(mode)	__S_ISTYPE((mode), __S_IFSOCK)
#endif
#endif


/* Protection bits.  */

#define	S_ISUID __S_ISUID	/* Set user ID on execution.  */
#define	S_ISGID	__S_ISGID	/* Set group ID on execution.  */

#if defined(__USE_BSD) || defined(__USE_MISC)
/* Save swapped text after use (sticky bit).  This is pretty well obsolete.  */
#define	S_ISVTX	__S_ISVTX
#endif

#define	S_IRUSR	__S_IREAD	/* Read by owner.  */
#define	S_IWUSR	__S_IWRITE	/* Write by owner.  */
#define	S_IXUSR	__S_IEXEC	/* Execute by owner.  */
/* Read, write, and execute by owner.  */
#define	S_IRWXU	(__S_IREAD|__S_IWRITE|__S_IEXEC)

#if	defined(__USE_MISC) && defined(__USE_BSD)
#define	S_IREAD		S_IRUSR
#define	S_IWRITE	S_IWUSR
#define	S_IEXEC		S_IXUSR
#endif

#define	S_IRGRP	(S_IRUSR >> 3)	/* Read by group.  */
#define	S_IWGRP	(S_IWUSR >> 3)	/* Write by group.  */
#define	S_IXGRP	(S_IXUSR >> 3)	/* Execute by group.  */
/* Read, write, and execute by group.  */
#define	S_IRWXG	(S_IRWXU >> 3)

#define	S_IROTH	(S_IRGRP >> 3)	/* Read by others.  */
#define	S_IWOTH	(S_IWGRP >> 3)	/* Write by others.  */
#define	S_IXOTH	(S_IXGRP >> 3)	/* Execute by others.  */
/* Read, write, and execute by others.  */
#define	S_IRWXO	(S_IRWXG >> 3)


#ifdef	__USE_BSD
/* Macros for common mode bit masks.  */
#define	ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */
#define	ALLPERMS (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO)/* 07777 */
#define	DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)/* 0666 */

#define S_BLKSIZE	512	/* Block size for `st_blocks'.  */
#endif


/* Get file attributes for FILE and put them in BUF.  */
extern int __stat __P ((__const char *__file, struct stat *__buf));
extern int stat __P ((__const char *__file, struct stat *__buf));

/* Get file attributes for the file, device, pipe, or socket
   that file descriptor FD is open on and put them in BUF.  */
extern int __fstat __P ((int __fd, struct stat *__buf));
extern int fstat __P ((int __fd, struct stat *__buf));

/* Get file attributes about FILE and put them in BUF.
   If FILE is a symbolic link, do not follow it.  */
extern int __lstat __P ((__const char *__file, struct stat *__buf));
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
extern int lstat __P ((__const char *__file, struct stat *__buf));
#endif

/* Set file access permissions for FILE to MODE.
   This takes an `int' MODE argument because that
   is what `mode_t's get widened to.  */
extern int __chmod __P ((__const char *__file, __mode_t __mode));
extern int chmod __P ((__const char *__file, __mode_t __mode));

/* Set file access permissions of the file FD is open on to MODE.  */
extern int __fchmod __P ((int __fd, __mode_t __mode));
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
extern int fchmod __P ((int __fd, __mode_t __mode));
#endif


/* Set the file creation mask of the current process to MASK,
   and return the old creation mask.  */
extern __mode_t __umask __P ((__mode_t __mask));
extern __mode_t umask __P ((__mode_t __mask));

#ifdef	__USE_GNU
/* Get the current `umask' value without changing it.
   This function is only available under the GNU Hurd.  */
extern __mode_t getumask __P ((void));
#endif

/* Create a new directory named PATH, with permission bits MODE.  */
extern int __mkdir __P ((__const char *__path, __mode_t __mode));
extern int mkdir __P ((__const char *__path, __mode_t __mode));

/* Create a device file named PATH, with permission and special bits MODE
   and device number DEV (which can be constructed from major and minor
   device numbers with the `makedev' macro above).  */
extern int __mknod __P ((__const char *__path,
			 __mode_t __mode, __dev_t __dev));
#if defined(__USE_MISC) || defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
extern int mknod __P ((__const char *__path,
		       __mode_t __mode, __dev_t __dev));
#endif


/* Create a new FIFO named PATH, with permission bits MODE.  */
extern int mkfifo __P ((__const char *__path, __mode_t __mode));

/* To allow the `struct stat' structure and the file type `mode_t'
   bits to vary without changing shared library major version number,
   the `stat' family of functions and `mknod' are in fact inline
   wrappers around calls to `xstat', `fxstat', `lxstat', and `xmknod',
   which all take a leading version-number argument designating the
   data structure and bits used.  <bits/stat.h> defines _STAT_VER with
   the version number corresponding to `struct stat' as defined in
   that file; and _MKNOD_VER with the version number corresponding to
   the S_IF* macros defined therein.  It is arranged that when not
   inlined these function are always statically linked; that way a
   dynamically-linked executable always encodes the version number
   corresponding to the data structures it uses, so the `x' functions
   in the shared library can adapt without needing to recompile all
   callers.  */

#ifndef _STAT_VER
#define _STAT_VER	0
#endif
#ifndef _MKNOD_VER
#define _MKNOD_VER	0
#endif

/* Wrappers for stat and mknod system calls.  */
extern int __fxstat __P ((int __ver, int __fildes,
			  struct stat *__stat_buf));
extern int __xstat __P ((int __ver, __const char *__filename,
			 struct stat *__stat_buf));
extern int __lxstat __P ((int __ver, __const char *__filename,
			  struct stat *__stat_buf));
extern int __xmknod __P ((int __ver, __const char *__path,
			  __mode_t __mode, __dev_t *__dev));

#if defined (__GNUC__) && __GNUC__ >= 2
/* Inlined versions of the real stat and mknod functions.  */

extern __inline__ int __stat (__const char *__path, struct stat *__statbuf)
{ return __xstat (_STAT_VER, __path, __statbuf); }
extern __inline__ int stat (__const char *__path, struct stat *__statbuf)
{ return __xstat (_STAT_VER, __path, __statbuf); }

extern __inline__ int __lstat(__const char *__path, struct stat *__statbuf)
{ return __lxstat (_STAT_VER, __path, __statbuf); }
#if defined(__USE_BSD) || defined(__USE_XOPEN_EXTENDED)
extern __inline__ int lstat(__const char *__path, struct stat *__statbuf)
{ return __lxstat (_STAT_VER, __path, __statbuf); }
#endif

extern __inline__ int __fstat (int __fd, struct stat *__statbuf)
{ return __fxstat (_STAT_VER, __fd, __statbuf); }
extern __inline__ int fstat (int __fd, struct stat *__statbuf)
{ return __fxstat (_STAT_VER, __fd, __statbuf); }

extern __inline__ int __mknod (__const char *__path, __mode_t __mode,
			       __dev_t __dev)
{ return __xmknod (_MKNOD_VER, __path, __mode, &__dev); }
#if	defined(__USE_MISC) || defined(__USE_BSD)
extern __inline__ int mknod (__const char *__path, __mode_t __mode,
			     __dev_t __dev)
{ return __xmknod (_MKNOD_VER, __path, __mode, &__dev); }
#endif

#endif

__END_DECLS


#endif /* sys/stat.h  */