Commit | Line | Data |
---|---|---|
984263bc MD |
1 | /*- |
2 | * Copyright (c) 1983, 1990, 1993 | |
3 | * The Regents of the University of California. All rights reserved. | |
4 | * (c) UNIX System Laboratories, Inc. | |
5 | * All or some portions of this file are derived from material licensed | |
6 | * to the University of California by American Telephone and Telegraph | |
7 | * Co. or Unix System Laboratories, Inc. and are reproduced herein with | |
8 | * the permission of UNIX System Laboratories, Inc. | |
9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | |
15 | * 2. Redistributions in binary form must reproduce the above copyright | |
16 | * notice, this list of conditions and the following disclaimer in the | |
17 | * documentation and/or other materials provided with the distribution. | |
2c64e990 | 18 | * 3. Neither the name of the University nor the names of its contributors |
984263bc MD |
19 | * may be used to endorse or promote products derived from this software |
20 | * without specific prior written permission. | |
21 | * | |
22 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
23 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
24 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
25 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
27 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
28 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
29 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
30 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
31 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
32 | * SUCH DAMAGE. | |
33 | * | |
34 | * @(#)fcntl.h 8.3 (Berkeley) 1/21/94 | |
35 | * $FreeBSD: src/sys/sys/fcntl.h,v 1.9.2.2 2001/06/03 05:00:10 dillon Exp $ | |
36 | */ | |
37 | ||
38 | #ifndef _SYS_FCNTL_H_ | |
39 | #define _SYS_FCNTL_H_ | |
40 | ||
1c4819b6 | 41 | #include <sys/cdefs.h> |
1bd40720 | 42 | #ifndef _SYS_TYPES_H_ |
984263bc MD |
43 | #include <sys/types.h> |
44 | #endif | |
45 | ||
46 | /* | |
47 | * File status flags: these are used by open(2), fcntl(2). | |
48 | * They are also used (indirectly) in the kernel file structure f_flags, | |
49 | * which is a superset of the open/fcntl flags. Open flags and f_flags | |
50 | * are inter-convertible using OFLAGS(fflags) and FFLAGS(oflags). | |
51 | * Open/fcntl flags begin with O_; kernel-internal flags begin with F. | |
52 | */ | |
53 | /* open-only flags */ | |
54 | #define O_RDONLY 0x0000 /* open for reading only */ | |
55 | #define O_WRONLY 0x0001 /* open for writing only */ | |
56 | #define O_RDWR 0x0002 /* open for reading and writing */ | |
57 | #define O_ACCMODE 0x0003 /* mask for above modes */ | |
58 | ||
59 | /* | |
60 | * Kernel encoding of open mode; separate read and write bits that are | |
61 | * independently testable: 1 greater than the above. | |
62 | * | |
63 | * XXX | |
64 | * FREAD and FWRITE are excluded from the #ifdef _KERNEL so that TIOCFLUSH, | |
65 | * which was documented to use FREAD/FWRITE, continues to work. | |
66 | */ | |
1c4819b6 | 67 | #if __BSD_VISIBLE |
984263bc MD |
68 | #define FREAD 0x0001 |
69 | #define FWRITE 0x0002 | |
70 | #endif | |
71 | #define O_NONBLOCK 0x0004 /* no delay */ | |
72 | #define O_APPEND 0x0008 /* set append mode */ | |
1c4819b6 | 73 | #if __BSD_VISIBLE |
984263bc MD |
74 | #define O_SHLOCK 0x0010 /* open with shared file lock */ |
75 | #define O_EXLOCK 0x0020 /* open with exclusive file lock */ | |
76 | #define O_ASYNC 0x0040 /* signal pgrp when data ready */ | |
77 | #define O_FSYNC 0x0080 /* synchronous writes */ | |
984263bc | 78 | #endif |
b7e57637 | 79 | #define O_SYNC 0x0080 /* Same as O_FSYNC, but POSIX */ |
1c4819b6 SW |
80 | #if __POSIX_VISIBLE >= 200809 |
81 | #define O_NOFOLLOW 0x0100 /* don't follow symlinks */ | |
82 | #endif | |
984263bc MD |
83 | #define O_CREAT 0x0200 /* create if nonexistent */ |
84 | #define O_TRUNC 0x0400 /* truncate to zero length */ | |
85 | #define O_EXCL 0x0800 /* error if already exists */ | |
17afb26b | 86 | #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES) |
984263bc MD |
87 | #define FMARK 0x1000 /* mark during gc() */ |
88 | #define FDEFER 0x2000 /* defer for next gc pass */ | |
89 | #define FHASLOCK 0x4000 /* descriptor holds advisory lock */ | |
90 | #endif | |
91 | ||
92 | /* Defined by POSIX 1003.1; BSD default, but must be distinct from O_RDONLY. */ | |
93 | #define O_NOCTTY 0x8000 /* don't assign controlling terminal */ | |
94 | ||
1c4819b6 | 95 | #if __BSD_VISIBLE |
9ba76b73 | 96 | /* Attempt to bypass the buffer cache */ |
3ac10855 | 97 | #define O_DIRECT 0x00010000 |
1c4819b6 | 98 | #endif |
984263bc | 99 | |
05eaf8a2 | 100 | #if __POSIX_VISIBLE >= 200809 |
3ac10855 | 101 | #define O_CLOEXEC 0x00020000 /* atomically set FD_CLOEXEC */ |
6e4ea98e | 102 | #endif |
3ac10855 SW |
103 | #define O_FBLOCKING 0x00040000 /* force blocking I/O */ |
104 | #define O_FNONBLOCKING 0x00080000 /* force non-blocking I/O */ | |
105 | #define O_FAPPEND 0x00100000 /* force append mode for write */ | |
106 | #define O_FOFFSET 0x00200000 /* force specific offset */ | |
107 | #define O_FSYNCWRITE 0x00400000 /* force synchronous write */ | |
108 | #define O_FASYNCWRITE 0x00800000 /* force asynchronous write */ | |
d84f6fa1 | 109 | #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES) |
d0d1aa2f | 110 | #define O_UNUSED24 0x01000000 |
3ac10855 | 111 | #define O_UNUSED25 0x02000000 |
d84f6fa1 MD |
112 | #define O_UNUSED26 0x04000000 |
113 | #endif | |
9ba76b73 | 114 | |
05eaf8a2 | 115 | #if __POSIX_VISIBLE >= 200809 |
3ac10855 | 116 | #define O_DIRECTORY 0x08000000 /* error if not a directory */ |
8a7990ec | 117 | #endif |
28d748b9 | 118 | |
ea8f324c | 119 | #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES) |
3ac10855 SW |
120 | #define FREVOKED 0x10000000 /* revoked by fdrevoke() */ |
121 | #define FAPPENDONLY 0x20000000 /* O_APPEND cannot be changed */ | |
122 | #define FOFFSETLOCK 0x40000000 /* f_offset locked */ | |
123 | #define FOFFSETWAKE 0x80000000 /* f_offset wakeup */ | |
ea8f324c MD |
124 | #endif |
125 | ||
3ac10855 | 126 | #define O_FMASK (O_FBLOCKING|O_FNONBLOCKING|O_FAPPEND|O_FOFFSET|\ |
d84f6fa1 | 127 | O_FSYNCWRITE|O_FASYNCWRITE) |
9ba76b73 | 128 | |
984263bc MD |
129 | #ifdef _KERNEL |
130 | /* convert from open() flags to/from fflags; convert O_RD/WR to FREAD/FWRITE */ | |
131 | #define FFLAGS(oflags) ((oflags) + 1) | |
132 | #define OFLAGS(fflags) ((fflags) - 1) | |
133 | ||
a8f17008 MD |
134 | /* |
135 | * Bits to save after open from the ap. Remaining bits are retained. | |
136 | */ | |
a5c89b33 | 137 | #define FMASK (FREAD|FWRITE|FAPPEND|FASYNC|FFSYNC|FNONBLOCK|\ |
d84f6fa1 | 138 | FAPPENDONLY|FREVOKED|O_DIRECT) |
984263bc | 139 | /* bits settable by fcntl(F_SETFL, ...) */ |
a5c89b33 | 140 | #define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FPOSIXSHM|\ |
d84f6fa1 | 141 | O_DIRECT) |
984263bc MD |
142 | #endif |
143 | ||
144 | /* | |
145 | * The O_* flags used to have only F* names, which were used in the kernel | |
146 | * and by fcntl. We retain the F* names for the kernel f_flag field | |
147 | * and for backward compatibility for fcntl. | |
148 | */ | |
1c4819b6 | 149 | #if __BSD_VISIBLE |
984263bc MD |
150 | #define FAPPEND O_APPEND /* kernel/compat */ |
151 | #define FASYNC O_ASYNC /* kernel/compat */ | |
152 | #define FFSYNC O_FSYNC /* kernel */ | |
153 | #define FNONBLOCK O_NONBLOCK /* kernel */ | |
154 | #define FNDELAY O_NONBLOCK /* compat */ | |
155 | #define O_NDELAY O_NONBLOCK /* compat */ | |
156 | #endif | |
157 | ||
158 | /* | |
159 | * We are out of bits in f_flag (which is a short). However, | |
160 | * the flag bits not set in FMASK are only meaningful in the | |
161 | * initial open syscall. Those bits can thus be given a | |
162 | * different meaning for fcntl(2). | |
163 | */ | |
1c4819b6 | 164 | #if __BSD_VISIBLE |
984263bc MD |
165 | |
166 | /* | |
167 | * Set by shm_open(3) to get automatic MAP_ASYNC behavior | |
168 | * for POSIX shared memory objects (which are otherwise | |
169 | * implemented as plain files). | |
170 | */ | |
171 | #define FPOSIXSHM O_NOFOLLOW | |
172 | #endif | |
173 | ||
1c4819b6 | 174 | #if __POSIX_VISIBLE >= 200809 |
83a11774 | 175 | /* |
e101a3f4 | 176 | * Constants used by "at" family of system calls. |
83a11774 | 177 | */ |
3ac10855 SW |
178 | #define AT_FDCWD 0xFFFAFDCD /* invalid file descriptor */ |
179 | #define AT_SYMLINK_NOFOLLOW 1 | |
180 | #define AT_REMOVEDIR 2 | |
181 | #define AT_EACCESS 4 | |
182 | #define AT_SYMLINK_FOLLOW 8 | |
1c4819b6 | 183 | #endif |
83a11774 | 184 | |
984263bc MD |
185 | /* |
186 | * Constants used for fcntl(2) | |
187 | */ | |
188 | ||
189 | /* command values */ | |
190 | #define F_DUPFD 0 /* duplicate file descriptor */ | |
191 | #define F_GETFD 1 /* get file descriptor flags */ | |
192 | #define F_SETFD 2 /* set file descriptor flags */ | |
193 | #define F_GETFL 3 /* get file status flags */ | |
194 | #define F_SETFL 4 /* set file status flags */ | |
1c4819b6 | 195 | #if __XSI_VISIBLE || __POSIX_VISIBLE >= 200112 |
984263bc | 196 | #define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */ |
a2988f1b | 197 | #define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */ |
984263bc MD |
198 | #endif |
199 | #define F_GETLK 7 /* get record locking information */ | |
200 | #define F_SETLK 8 /* set record locking information */ | |
201 | #define F_SETLKW 9 /* F_SETLK; wait if blocked */ | |
1c4819b6 | 202 | #if __BSD_VISIBLE |
a2988f1b | 203 | #define F_DUP2FD 10 /* duplicate file descriptor to arg */ |
1c4819b6 | 204 | #endif |
05eaf8a2 | 205 | #if __POSIX_VISIBLE >= 200809 |
a2988f1b JM |
206 | #define F_DUPFD_CLOEXEC 17 /* Like F_DUPFD with FD_CLOEXEC set */ |
207 | #endif | |
208 | #if __BSD_VISIBLE | |
209 | #define F_DUP2FD_CLOEXEC 18 /* Like F_DUP2FD with FD_CLOEXEC set */ | |
36f3145a | 210 | #define F_GETPATH 19 /* retrieve full path to file associated with fd */ |
a2988f1b | 211 | #endif |
984263bc MD |
212 | |
213 | /* file descriptor flags (F_GETFD, F_SETFD) */ | |
214 | #define FD_CLOEXEC 1 /* close-on-exec flag */ | |
215 | ||
216 | /* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */ | |
217 | #define F_RDLCK 1 /* shared or read lock */ | |
218 | #define F_UNLCK 2 /* unlock */ | |
219 | #define F_WRLCK 3 /* exclusive or write lock */ | |
17afb26b | 220 | #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES) |
984263bc | 221 | #define F_WAIT 0x010 /* Wait until lock is granted */ |
71c18fe3 | 222 | #define F_UNUSED020 0x020 |
984263bc | 223 | #define F_POSIX 0x040 /* Use POSIX semantics for lock */ |
508ceb09 | 224 | #define F_NOEND 0x080 /* l_len = 0, internally used */ |
984263bc MD |
225 | #endif |
226 | ||
83a11774 | 227 | |
984263bc MD |
228 | /* |
229 | * Advisory file segment locking data type - | |
230 | * information passed to system by user | |
231 | */ | |
232 | struct flock { | |
233 | off_t l_start; /* starting offset */ | |
234 | off_t l_len; /* len = 0 means until end of file */ | |
235 | pid_t l_pid; /* lock owner */ | |
236 | short l_type; /* lock type: read/write, etc. */ | |
237 | short l_whence; /* type of l_start */ | |
238 | }; | |
239 | ||
dda4b42b DRJ |
240 | #ifdef _KERNEL |
241 | union fcntl_dat { | |
242 | int fc_fd; /* F_DUPFD */ | |
243 | int fc_cloexec; /* F_GETFD/F_SETFD */ | |
244 | int fc_flags; /* F_GETFL/F_SETFL */ | |
245 | int fc_owner; /* F_GETOWN/F_SETOWN */ | |
246 | struct flock fc_flock; /* F_GETLK/F_SETLK */ | |
36f3145a | 247 | struct { |
248 | char *ptr; | |
249 | char *buf; | |
250 | } fc_path; /* F_GETPATH */ | |
dda4b42b DRJ |
251 | }; |
252 | #endif /* _KERNEL */ | |
253 | ||
984263bc | 254 | |
1c4819b6 | 255 | #if __BSD_VISIBLE |
984263bc MD |
256 | /* lock operations for flock(2) */ |
257 | #define LOCK_SH 0x01 /* shared file lock */ | |
258 | #define LOCK_EX 0x02 /* exclusive file lock */ | |
259 | #define LOCK_NB 0x04 /* don't block when locking */ | |
260 | #define LOCK_UN 0x08 /* unlock file */ | |
261 | #endif | |
262 | ||
f3009115 SW |
263 | /* Always ensure that these are consistent with <stdio.h> and <unistd.h>! */ |
264 | #ifndef SEEK_SET | |
265 | #define SEEK_SET 0 /* set file offset to offset */ | |
266 | #endif | |
267 | #ifndef SEEK_CUR | |
268 | #define SEEK_CUR 1 /* set file offset to current plus offset */ | |
269 | #endif | |
270 | #ifndef SEEK_END | |
271 | #define SEEK_END 2 /* set file offset to EOF plus offset */ | |
272 | #endif | |
273 | ||
274 | /* Always ensure that these are consistent with <stat.h>! */ | |
275 | #ifndef S_ISUID | |
276 | #define S_ISUID 0004000 /* set user id on execution */ | |
277 | #endif | |
278 | #ifndef S_ISGID | |
279 | #define S_ISGID 0002000 /* set group id on execution */ | |
280 | #endif | |
281 | #ifndef S_IRWXU | |
282 | #define S_IRWXU 0000700 /* RWX mask for owner */ | |
283 | #endif | |
284 | #ifndef S_IRUSR | |
285 | #define S_IRUSR 0000400 /* R for owner */ | |
286 | #endif | |
287 | #ifndef S_IWUSR | |
288 | #define S_IWUSR 0000200 /* W for owner */ | |
289 | #endif | |
290 | #ifndef S_IXUSR | |
291 | #define S_IXUSR 0000100 /* X for owner */ | |
292 | #endif | |
293 | #ifndef S_IRWXG | |
294 | #define S_IRWXG 0000070 /* RWX mask for group */ | |
295 | #endif | |
296 | #ifndef S_IRGRP | |
297 | #define S_IRGRP 0000040 /* R for group */ | |
298 | #endif | |
299 | #ifndef S_IWGRP | |
300 | #define S_IWGRP 0000020 /* W for group */ | |
301 | #endif | |
302 | #ifndef S_IXGRP | |
303 | #define S_IXGRP 0000010 /* X for group */ | |
304 | #endif | |
305 | #ifndef S_IRWXO | |
306 | #define S_IRWXO 0000007 /* RWX mask for other */ | |
307 | #endif | |
308 | #ifndef S_IROTH | |
309 | #define S_IROTH 0000004 /* R for other */ | |
310 | #endif | |
311 | #ifndef S_IWOTH | |
312 | #define S_IWOTH 0000002 /* W for other */ | |
313 | #endif | |
314 | #ifndef S_IXOTH | |
315 | #define S_IXOTH 0000001 /* X for other */ | |
316 | #endif | |
317 | ||
d2140592 | 318 | #if !defined(_KERNEL) && __POSIX_VISIBLE >= 200112 |
d60b58c8 SW |
319 | /* |
320 | * Advice to be applied to the file data | |
d2140592 | 321 | * For POSIX compliance only. DragonFly does not use this information. |
d60b58c8 SW |
322 | */ |
323 | #define POSIX_FADV_NORMAL 0 /* no advice */ | |
324 | #define POSIX_FADV_SEQUENTIAL 1 /* expect sequential access */ | |
325 | #define POSIX_FADV_RANDOM 2 /* expect random access */ | |
326 | #define POSIX_FADV_WILLNEED 3 /* expect access in the near future */ | |
327 | #define POSIX_FADV_DONTNEED 4 /* expect no access in the near future */ | |
328 | #define POSIX_FADV_NOREUSE 5 /* expect access only once */ | |
329 | #endif | |
330 | ||
44a09dd6 | 331 | #if !defined(_KERNEL) || defined(_KERNEL_VIRTUAL) |
984263bc | 332 | __BEGIN_DECLS |
3ac10855 | 333 | int open(const char *, int, ...); |
05eaf8a2 | 334 | #if __POSIX_VISIBLE >= 200809 |
3ac10855 | 335 | int openat(int, const char *, int, ...); |
509a01fa | 336 | #endif |
3ac10855 SW |
337 | int creat(const char *, mode_t); |
338 | int fcntl(int, int, ...); | |
1c4819b6 | 339 | #if __BSD_VISIBLE |
3ac10855 | 340 | int flock(int, int); |
32cd090f | 341 | #endif /* __BSD_VISIBLE */ |
378a5fa4 SW |
342 | #if __POSIX_VISIBLE >= 200112 |
343 | int posix_fadvise(int, off_t, off_t, int); | |
344 | int posix_fallocate(int, off_t, off_t); | |
345 | #endif | |
984263bc MD |
346 | __END_DECLS |
347 | #endif | |
348 | ||
349 | #endif /* !_SYS_FCNTL_H_ */ |