]>
Commit | Line | Data |
---|---|---|
1 | /* Copyright (C) 1991-2018 Free Software Foundation, Inc. | |
2 | This file is part of the GNU C Library. | |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
5 | modify it under the terms of the GNU Lesser General Public | |
6 | License as published by the Free Software Foundation; either | |
7 | version 2.1 of the License, or (at your option) any later version. | |
8 | ||
9 | The GNU C Library is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | Lesser General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU Lesser General Public | |
15 | License along with the GNU C Library; if not, see | |
16 | <http://www.gnu.org/licenses/>. */ | |
17 | ||
18 | /* | |
19 | * POSIX Standard: 6.5 File Control Operations <fcntl.h> | |
20 | */ | |
21 | ||
22 | #ifndef _FCNTL_H | |
23 | #define _FCNTL_H 1 | |
24 | ||
25 | #include <features.h> | |
26 | ||
27 | /* This must be early so <bits/fcntl.h> can define types winningly. */ | |
28 | __BEGIN_DECLS | |
29 | ||
30 | /* Get __mode_t, __dev_t and __off_t .*/ | |
31 | #include <bits/types.h> | |
32 | ||
33 | /* Get the definitions of O_*, F_*, FD_*: all the | |
34 | numbers and flag bits for `open', `fcntl', et al. */ | |
35 | #include <bits/fcntl.h> | |
36 | ||
37 | /* Detect if open needs mode as a third argument (or for openat as a fourth | |
38 | argument). */ | |
39 | #ifdef __O_TMPFILE | |
40 | # define __OPEN_NEEDS_MODE(oflag) \ | |
41 | (((oflag) & O_CREAT) != 0 || ((oflag) & __O_TMPFILE) == __O_TMPFILE) | |
42 | #else | |
43 | # define __OPEN_NEEDS_MODE(oflag) (((oflag) & O_CREAT) != 0) | |
44 | #endif | |
45 | ||
46 | /* POSIX.1-2001 specifies that these types are defined by <fcntl.h>. | |
47 | Earlier POSIX standards permitted any type ending in `_t' to be defined | |
48 | by any POSIX header, so we don't conditionalize the definitions here. */ | |
49 | #ifndef __mode_t_defined | |
50 | typedef __mode_t mode_t; | |
51 | # define __mode_t_defined | |
52 | #endif | |
53 | ||
54 | #ifndef __off_t_defined | |
55 | # ifndef __USE_FILE_OFFSET64 | |
56 | typedef __off_t off_t; | |
57 | # else | |
58 | typedef __off64_t off_t; | |
59 | # endif | |
60 | # define __off_t_defined | |
61 | #endif | |
62 | ||
63 | #if defined __USE_LARGEFILE64 && !defined __off64_t_defined | |
64 | typedef __off64_t off64_t; | |
65 | # define __off64_t_defined | |
66 | #endif | |
67 | ||
68 | #ifndef __pid_t_defined | |
69 | typedef __pid_t pid_t; | |
70 | # define __pid_t_defined | |
71 | #endif | |
72 | ||
73 | /* For XPG all symbols from <sys/stat.h> should also be available. */ | |
74 | #ifdef __USE_XOPEN2K8 | |
75 | # include <bits/types/struct_timespec.h> | |
76 | #endif | |
77 | #if defined __USE_XOPEN || defined __USE_XOPEN2K8 | |
78 | # include <bits/stat.h> | |
79 | ||
80 | # define S_IFMT __S_IFMT | |
81 | # define S_IFDIR __S_IFDIR | |
82 | # define S_IFCHR __S_IFCHR | |
83 | # define S_IFBLK __S_IFBLK | |
84 | # define S_IFREG __S_IFREG | |
85 | # ifdef __S_IFIFO | |
86 | # define S_IFIFO __S_IFIFO | |
87 | # endif | |
88 | # ifdef __S_IFLNK | |
89 | # define S_IFLNK __S_IFLNK | |
90 | # endif | |
91 | # if (defined __USE_UNIX98 || defined __USE_XOPEN2K8) && defined __S_IFSOCK | |
92 | # define S_IFSOCK __S_IFSOCK | |
93 | # endif | |
94 | ||
95 | /* Protection bits. */ | |
96 | ||
97 | # define S_ISUID __S_ISUID /* Set user ID on execution. */ | |
98 | # define S_ISGID __S_ISGID /* Set group ID on execution. */ | |
99 | ||
100 | # if defined __USE_MISC || defined __USE_XOPEN | |
101 | /* Save swapped text after use (sticky bit). This is pretty well obsolete. */ | |
102 | # define S_ISVTX __S_ISVTX | |
103 | # endif | |
104 | ||
105 | # define S_IRUSR __S_IREAD /* Read by owner. */ | |
106 | # define S_IWUSR __S_IWRITE /* Write by owner. */ | |
107 | # define S_IXUSR __S_IEXEC /* Execute by owner. */ | |
108 | /* Read, write, and execute by owner. */ | |
109 | # define S_IRWXU (__S_IREAD|__S_IWRITE|__S_IEXEC) | |
110 | ||
111 | # define S_IRGRP (S_IRUSR >> 3) /* Read by group. */ | |
112 | # define S_IWGRP (S_IWUSR >> 3) /* Write by group. */ | |
113 | # define S_IXGRP (S_IXUSR >> 3) /* Execute by group. */ | |
114 | /* Read, write, and execute by group. */ | |
115 | # define S_IRWXG (S_IRWXU >> 3) | |
116 | ||
117 | # define S_IROTH (S_IRGRP >> 3) /* Read by others. */ | |
118 | # define S_IWOTH (S_IWGRP >> 3) /* Write by others. */ | |
119 | # define S_IXOTH (S_IXGRP >> 3) /* Execute by others. */ | |
120 | /* Read, write, and execute by others. */ | |
121 | # define S_IRWXO (S_IRWXG >> 3) | |
122 | #endif | |
123 | ||
124 | #ifdef __USE_MISC | |
125 | # ifndef R_OK /* Verbatim from <unistd.h>. Ugh. */ | |
126 | /* Values for the second argument to access. | |
127 | These may be OR'd together. */ | |
128 | # define R_OK 4 /* Test for read permission. */ | |
129 | # define W_OK 2 /* Test for write permission. */ | |
130 | # define X_OK 1 /* Test for execute permission. */ | |
131 | # define F_OK 0 /* Test for existence. */ | |
132 | # endif | |
133 | #endif /* Use misc. */ | |
134 | ||
135 | /* XPG wants the following symbols. <stdio.h> has the same definitions. */ | |
136 | #if defined __USE_XOPEN || defined __USE_XOPEN2K8 | |
137 | # define SEEK_SET 0 /* Seek from beginning of file. */ | |
138 | # define SEEK_CUR 1 /* Seek from current position. */ | |
139 | # define SEEK_END 2 /* Seek from end of file. */ | |
140 | #endif /* XPG */ | |
141 | ||
142 | /* The constants AT_REMOVEDIR and AT_EACCESS have the same value. AT_EASSESS | |
143 | is meaningful only to faccessat, while AT_REMOVEDIR is meaningful only to | |
144 | unlinkat. The two functions do completely different things and therefore, | |
145 | the flags can be allowed to overlap. For example, passing AT_REMOVEDIR to | |
146 | faccessat would be undefined behavior and thus treating it equivalent to | |
147 | AT_EACCESS is valid undefined behavior. */ | |
148 | #ifdef __USE_ATFILE | |
149 | # define AT_FDCWD -100 /* Special value used to indicate | |
150 | the *at functions should use the | |
151 | current working directory. */ | |
152 | # define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ | |
153 | # define AT_REMOVEDIR 0x200 /* Remove directory instead of | |
154 | unlinking file. */ | |
155 | # define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ | |
156 | # ifdef __USE_GNU | |
157 | # define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount | |
158 | traversal. */ | |
159 | # define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname. */ | |
160 | # endif | |
161 | # define AT_EACCESS 0x200 /* Test access permitted for | |
162 | effective IDs, not real IDs. */ | |
163 | #endif | |
164 | ||
165 | /* Do the file control operation described by CMD on FD. | |
166 | The remaining arguments are interpreted depending on CMD. | |
167 | ||
168 | This function is a cancellation point and therefore not marked with | |
169 | __THROW. */ | |
170 | extern int fcntl (int __fd, int __cmd, ...); | |
171 | ||
172 | /* Open FILE and return a new file descriptor for it, or -1 on error. | |
173 | OFLAG determines the type of access used. If O_CREAT or O_TMPFILE is set | |
174 | in OFLAG, the third argument is taken as a `mode_t', the mode of the | |
175 | created file. | |
176 | ||
177 | This function is a cancellation point and therefore not marked with | |
178 | __THROW. */ | |
179 | #ifndef __USE_FILE_OFFSET64 | |
180 | extern int open (const char *__file, int __oflag, ...) __nonnull ((1)); | |
181 | #else | |
182 | # ifdef __REDIRECT | |
183 | extern int __REDIRECT (open, (const char *__file, int __oflag, ...), open64) | |
184 | __nonnull ((1)); | |
185 | # else | |
186 | # define open open64 | |
187 | # endif | |
188 | #endif | |
189 | #ifdef __USE_LARGEFILE64 | |
190 | extern int open64 (const char *__file, int __oflag, ...) __nonnull ((1)); | |
191 | #endif | |
192 | ||
193 | #ifdef __USE_ATFILE | |
194 | /* Similar to `open' but a relative path name is interpreted relative to | |
195 | the directory for which FD is a descriptor. | |
196 | ||
197 | NOTE: some other `openat' implementation support additional functionality | |
198 | through this interface, especially using the O_XATTR flag. This is not | |
199 | yet supported here. | |
200 | ||
201 | This function is a cancellation point and therefore not marked with | |
202 | __THROW. */ | |
203 | # ifndef __USE_FILE_OFFSET64 | |
204 | extern int openat (int __fd, const char *__file, int __oflag, ...) | |
205 | __nonnull ((2)); | |
206 | # else | |
207 | # ifdef __REDIRECT | |
208 | extern int __REDIRECT (openat, (int __fd, const char *__file, int __oflag, | |
209 | ...), openat64) __nonnull ((2)); | |
210 | # else | |
211 | # define openat openat64 | |
212 | # endif | |
213 | # endif | |
214 | # ifdef __USE_LARGEFILE64 | |
215 | extern int openat64 (int __fd, const char *__file, int __oflag, ...) | |
216 | __nonnull ((2)); | |
217 | # endif | |
218 | #endif | |
219 | ||
220 | /* Create and open FILE, with mode MODE. This takes an `int' MODE | |
221 | argument because that is what `mode_t' will be widened to. | |
222 | ||
223 | This function is a cancellation point and therefore not marked with | |
224 | __THROW. */ | |
225 | #ifndef __USE_FILE_OFFSET64 | |
226 | extern int creat (const char *__file, mode_t __mode) __nonnull ((1)); | |
227 | #else | |
228 | # ifdef __REDIRECT | |
229 | extern int __REDIRECT (creat, (const char *__file, mode_t __mode), | |
230 | creat64) __nonnull ((1)); | |
231 | # else | |
232 | # define creat creat64 | |
233 | # endif | |
234 | #endif | |
235 | #ifdef __USE_LARGEFILE64 | |
236 | extern int creat64 (const char *__file, mode_t __mode) __nonnull ((1)); | |
237 | #endif | |
238 | ||
239 | #if !defined F_LOCK && (defined __USE_MISC || (defined __USE_XOPEN_EXTENDED \ | |
240 | && !defined __USE_POSIX)) | |
241 | /* NOTE: These declarations also appear in <unistd.h>; be sure to keep both | |
242 | files consistent. Some systems have them there and some here, and some | |
243 | software depends on the macros being defined without including both. */ | |
244 | ||
245 | /* `lockf' is a simpler interface to the locking facilities of `fcntl'. | |
246 | LEN is always relative to the current file position. | |
247 | The CMD argument is one of the following. */ | |
248 | ||
249 | # define F_ULOCK 0 /* Unlock a previously locked region. */ | |
250 | # define F_LOCK 1 /* Lock a region for exclusive use. */ | |
251 | # define F_TLOCK 2 /* Test and lock a region for exclusive use. */ | |
252 | # define F_TEST 3 /* Test a region for other processes locks. */ | |
253 | ||
254 | # ifndef __USE_FILE_OFFSET64 | |
255 | extern int lockf (int __fd, int __cmd, off_t __len); | |
256 | # else | |
257 | # ifdef __REDIRECT | |
258 | extern int __REDIRECT (lockf, (int __fd, int __cmd, __off64_t __len), lockf64); | |
259 | # else | |
260 | # define lockf lockf64 | |
261 | # endif | |
262 | # endif | |
263 | # ifdef __USE_LARGEFILE64 | |
264 | extern int lockf64 (int __fd, int __cmd, off64_t __len); | |
265 | # endif | |
266 | #endif | |
267 | ||
268 | #ifdef __USE_XOPEN2K | |
269 | /* Advice the system about the expected behaviour of the application with | |
270 | respect to the file associated with FD. */ | |
271 | # ifndef __USE_FILE_OFFSET64 | |
272 | extern int posix_fadvise (int __fd, off_t __offset, off_t __len, | |
273 | int __advise) __THROW; | |
274 | # else | |
275 | # ifdef __REDIRECT_NTH | |
276 | extern int __REDIRECT_NTH (posix_fadvise, (int __fd, __off64_t __offset, | |
277 | __off64_t __len, int __advise), | |
278 | posix_fadvise64); | |
279 | # else | |
280 | # define posix_fadvise posix_fadvise64 | |
281 | # endif | |
282 | # endif | |
283 | # ifdef __USE_LARGEFILE64 | |
284 | extern int posix_fadvise64 (int __fd, off64_t __offset, off64_t __len, | |
285 | int __advise) __THROW; | |
286 | # endif | |
287 | ||
288 | ||
289 | /* Reserve storage for the data of the file associated with FD. | |
290 | ||
291 | This function is a possible cancellation point and therefore not | |
292 | marked with __THROW. */ | |
293 | # ifndef __USE_FILE_OFFSET64 | |
294 | extern int posix_fallocate (int __fd, off_t __offset, off_t __len); | |
295 | # else | |
296 | # ifdef __REDIRECT | |
297 | extern int __REDIRECT (posix_fallocate, (int __fd, __off64_t __offset, | |
298 | __off64_t __len), | |
299 | posix_fallocate64); | |
300 | # else | |
301 | # define posix_fallocate posix_fallocate64 | |
302 | # endif | |
303 | # endif | |
304 | # ifdef __USE_LARGEFILE64 | |
305 | extern int posix_fallocate64 (int __fd, off64_t __offset, off64_t __len); | |
306 | # endif | |
307 | #endif | |
308 | ||
309 | ||
310 | /* Define some inlines helping to catch common problems. */ | |
311 | #if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function \ | |
312 | && defined __va_arg_pack_len | |
313 | # include <bits/fcntl2.h> | |
314 | #endif | |
315 | ||
316 | __END_DECLS | |
317 | ||
318 | #endif /* fcntl.h */ |