1 | /* $NetBSD: fcntl.h,v 1.50 2018/02/20 18:20:05 kamil Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 1983, 1990, 1993 |
5 | * The Regents of the University of California. All rights reserved. |
6 | * (c) UNIX System Laboratories, Inc. |
7 | * All or some portions of this file are derived from material licensed |
8 | * to the University of California by American Telephone and Telegraph |
9 | * Co. or Unix System Laboratories, Inc. and are reproduced herein with |
10 | * the permission of UNIX System Laboratories, Inc. |
11 | * |
12 | * Redistribution and use in source and binary forms, with or without |
13 | * modification, are permitted provided that the following conditions |
14 | * are met: |
15 | * 1. Redistributions of source code must retain the above copyright |
16 | * notice, this list of conditions and the following disclaimer. |
17 | * 2. Redistributions in binary form must reproduce the above copyright |
18 | * notice, this list of conditions and the following disclaimer in the |
19 | * documentation and/or other materials provided with the distribution. |
20 | * 3. Neither the name of the University nor the names of its contributors |
21 | * may be used to endorse or promote products derived from this software |
22 | * without specific prior written permission. |
23 | * |
24 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
25 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
27 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
30 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
31 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
32 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
33 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
34 | * SUCH DAMAGE. |
35 | * |
36 | * @(#)fcntl.h 8.3 (Berkeley) 1/21/94 |
37 | */ |
38 | |
39 | #ifndef _SYS_FCNTL_H_ |
40 | #define _SYS_FCNTL_H_ |
41 | |
42 | /* |
43 | * This file includes the definitions for open and fcntl |
44 | * described by POSIX for <fcntl.h>; it also includes |
45 | * related kernel definitions. |
46 | */ |
47 | |
48 | #ifndef _KERNEL |
49 | #include <sys/featuretest.h> |
50 | #include <sys/types.h> |
51 | #if defined(_XOPEN_SOURCE) |
52 | #include <sys/stat.h> |
53 | #endif /* _XOPEN_SOURCE */ |
54 | #endif /* !_KERNEL */ |
55 | |
56 | /* |
57 | * File status flags: these are used by open(2), fcntl(2). |
58 | * They are also used (indirectly) in the kernel file structure f_flags, |
59 | * which is a superset of the open/fcntl flags. Open flags and f_flags |
60 | * are inter-convertible using OFLAGS(fflags) and FFLAGS(oflags). |
61 | * Open/fcntl flags begin with O_; kernel-internal flags begin with F. |
62 | */ |
63 | /* open-only flags */ |
64 | #define O_RDONLY 0x00000000 /* open for reading only */ |
65 | #define O_WRONLY 0x00000001 /* open for writing only */ |
66 | #define O_RDWR 0x00000002 /* open for reading and writing */ |
67 | #define O_ACCMODE 0x00000003 /* mask for above modes */ |
68 | |
69 | /* |
70 | * Kernel encoding of open mode; separate read and write bits that are |
71 | * independently testable: 1 greater than the above. |
72 | * |
73 | * XXX |
74 | * FREAD and FWRITE are excluded from the #ifdef _KERNEL so that TIOCFLUSH, |
75 | * which was documented to use FREAD/FWRITE, continues to work. |
76 | */ |
77 | #if defined(_NETBSD_SOURCE) |
78 | #define FREAD 0x00000001 |
79 | #define FWRITE 0x00000002 |
80 | #endif |
81 | #define O_NONBLOCK 0x00000004 /* no delay */ |
82 | #define O_APPEND 0x00000008 /* set append mode */ |
83 | #if defined(_NETBSD_SOURCE) |
84 | #define O_SHLOCK 0x00000010 /* open with shared file lock */ |
85 | #define O_EXLOCK 0x00000020 /* open with exclusive file lock */ |
86 | #define O_ASYNC 0x00000040 /* signal pgrp when data ready */ |
87 | #endif |
88 | #if (_POSIX_C_SOURCE - 0) >= 199309L || \ |
89 | (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \ |
90 | (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE) |
91 | #define O_SYNC 0x00000080 /* synchronous writes */ |
92 | #endif |
93 | #if (_POSIX_C_SOURCE - 0) >= 200809L || defined(_NETBSD_SOURCE) |
94 | #define O_NOFOLLOW 0x00000100 /* don't follow symlinks on the last */ |
95 | /* path component */ |
96 | #endif |
97 | #define O_CREAT 0x00000200 /* create if nonexistent */ |
98 | #define O_TRUNC 0x00000400 /* truncate to zero length */ |
99 | #define O_EXCL 0x00000800 /* error if already exists */ |
100 | |
101 | /* defined by POSIX 1003.1; BSD default, but required to be bitwise distinct */ |
102 | #define O_NOCTTY 0x00008000 /* don't assign controlling terminal */ |
103 | |
104 | #if (_POSIX_C_SOURCE - 0) >= 199309L || (_XOPEN_SOURCE - 0) >= 500 || \ |
105 | defined(_NETBSD_SOURCE) |
106 | #define O_DSYNC 0x00010000 /* write: I/O data completion */ |
107 | #define O_RSYNC 0x00020000 /* read: I/O completion as for write */ |
108 | #endif |
109 | |
110 | #if defined(_NETBSD_SOURCE) |
111 | #define O_ALT_IO 0x00040000 /* use alternate i/o semantics */ |
112 | #define O_DIRECT 0x00080000 /* direct I/O hint */ |
113 | #endif |
114 | |
115 | #define O_DIRECTORY 0x00200000 /* fail if not a directory */ |
116 | #define O_CLOEXEC 0x00400000 /* set close on exec */ |
117 | #if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0 >= 700) || \ |
118 | defined(_INCOMPLETE_XOPEN_C063) || defined(_NETBSD_SOURCE) |
119 | #define O_SEARCH 0x00800000 /* skip search permission checks */ |
120 | #endif |
121 | #if defined(_NETBSD_SOURCE) |
122 | #define O_NOSIGPIPE 0x01000000 /* don't deliver sigpipe */ |
123 | #define O_REGULAR 0x02000000 /* fail if not a regular file */ |
124 | #endif |
125 | |
126 | #ifdef _KERNEL |
127 | /* convert from open() flags to/from fflags; convert O_RD/WR to FREAD/FWRITE */ |
128 | #define FFLAGS(oflags) ((oflags) + 1) |
129 | #define OFLAGS(fflags) ((fflags) - 1) |
130 | |
131 | /* all bits settable during open(2) */ |
132 | #define O_MASK (O_ACCMODE|O_NONBLOCK|O_APPEND|O_SHLOCK|O_EXLOCK|\ |
133 | O_ASYNC|O_SYNC|O_CREAT|O_TRUNC|O_EXCL|O_DSYNC|\ |
134 | O_RSYNC|O_NOCTTY|O_ALT_IO|O_NOFOLLOW|O_DIRECT|\ |
135 | O_DIRECTORY|O_CLOEXEC|O_NOSIGPIPE|O_REGULAR) |
136 | |
137 | #define FMARK 0x00001000 /* mark during gc() */ |
138 | #define FDEFER 0x00002000 /* defer for next gc pass */ |
139 | #define FHASLOCK 0x00004000 /* descriptor holds advisory lock */ |
140 | #define FSCAN 0x00100000 /* scan during gc passes */ |
141 | #define FSILENT 0x40000000 /* suppress kernel error messages */ |
142 | #define FKIOCTL 0x80000000 /* kernel originated ioctl */ |
143 | /* bits settable by fcntl(F_SETFL, ...) */ |
144 | #define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FDSYNC|FRSYNC|FALTIO|\ |
145 | FDIRECT|FNOSIGPIPE) |
146 | /* bits to save after open(2) */ |
147 | #define FMASK (FREAD|FWRITE|FCNTLFLAGS) |
148 | #endif /* _KERNEL */ |
149 | |
150 | /* |
151 | * The O_* flags used to have only F* names, which were used in the kernel |
152 | * and by fcntl. We retain the F* names for the kernel f_flags field |
153 | * and for backward compatibility for fcntl. |
154 | */ |
155 | #if defined(_NETBSD_SOURCE) |
156 | #define FAPPEND O_APPEND /* kernel/compat */ |
157 | #define FASYNC O_ASYNC /* kernel/compat */ |
158 | #define O_FSYNC O_SYNC /* compat */ |
159 | #define FNDELAY O_NONBLOCK /* compat */ |
160 | #define O_NDELAY O_NONBLOCK /* compat */ |
161 | #endif |
162 | #if defined(_KERNEL) |
163 | #define FNOSIGPIPE O_NOSIGPIPE /* kernel */ |
164 | #define FNONBLOCK O_NONBLOCK /* kernel */ |
165 | #define FFSYNC O_SYNC /* kernel */ |
166 | #define FDSYNC O_DSYNC /* kernel */ |
167 | #define FRSYNC O_RSYNC /* kernel */ |
168 | #define FALTIO O_ALT_IO /* kernel */ |
169 | #define FDIRECT O_DIRECT /* kernel */ |
170 | #endif |
171 | |
172 | /* |
173 | * Constants used for fcntl(2) |
174 | */ |
175 | |
176 | /* command values */ |
177 | #define F_DUPFD 0 /* duplicate file descriptor */ |
178 | #define F_GETFD 1 /* get file descriptor flags */ |
179 | #define F_SETFD 2 /* set file descriptor flags */ |
180 | #define F_GETFL 3 /* get file status flags */ |
181 | #define F_SETFL 4 /* set file status flags */ |
182 | #if (_POSIX_C_SOURCE - 0) >= 200112L || (_XOPEN_SOURCE - 0) >= 500 || \ |
183 | defined(_NETBSD_SOURCE) |
184 | #define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */ |
185 | #define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */ |
186 | #endif |
187 | #define F_GETLK 7 /* get record locking information */ |
188 | #define F_SETLK 8 /* set record locking information */ |
189 | #define F_SETLKW 9 /* F_SETLK; wait if blocked */ |
190 | #if defined(_NETBSD_SOURCE) |
191 | #define F_CLOSEM 10 /* close all fds >= to the one given */ |
192 | #define F_MAXFD 11 /* return the max open fd */ |
193 | #define F_DUPFD_CLOEXEC 12 /* close on exec duplicated fd */ |
194 | #define F_GETNOSIGPIPE 13 /* get SIGPIPE disposition */ |
195 | #define F_SETNOSIGPIPE 14 /* set SIGPIPE disposition */ |
196 | #endif |
197 | |
198 | /* file descriptor flags (F_GETFD, F_SETFD) */ |
199 | #define FD_CLOEXEC 1 /* close-on-exec flag */ |
200 | |
201 | /* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */ |
202 | #define F_RDLCK 1 /* shared or read lock */ |
203 | #define F_UNLCK 2 /* unlock */ |
204 | #define F_WRLCK 3 /* exclusive or write lock */ |
205 | #ifdef _KERNEL |
206 | #define F_WAIT 0x010 /* Wait until lock is granted */ |
207 | #define F_FLOCK 0x020 /* Use flock(2) semantics for lock */ |
208 | #define F_POSIX 0x040 /* Use POSIX semantics for lock */ |
209 | #endif |
210 | |
211 | /* Constants for fcntl's passed to the underlying fs - like ioctl's. */ |
212 | #if defined(_NETBSD_SOURCE) |
213 | #define F_PARAM_MASK 0xfff |
214 | #define F_PARAM_LEN(x) (((x) >> 16) & F_PARAM_MASK) |
215 | #define F_PARAM_MAX 4095 |
216 | #define F_FSCTL (int)0x80000000 /* This fcntl goes to the fs */ |
217 | #define F_FSVOID (int)0x40000000 /* no parameters */ |
218 | #define F_FSOUT (int)0x20000000 /* copy out parameter */ |
219 | #define F_FSIN (int)0x10000000 /* copy in parameter */ |
220 | #define F_FSINOUT (F_FSIN | F_FSOUT) |
221 | #define F_FSDIRMASK (int)0x70000000 /* mask for IN/OUT/VOID */ |
222 | #define F_FSPRIV (int)0x00008000 /* command is fs-specific */ |
223 | |
224 | /* |
225 | * Define command macros for operations which, if implemented, must be |
226 | * the same for all fs's. |
227 | */ |
228 | #define _FCN(inout, num, len) \ |
229 | (F_FSCTL | inout | ((len & F_PARAM_MASK) << 16) | (num)) |
230 | #define _FCNO(c) _FCN(F_FSVOID, (c), 0) |
231 | #define _FCNR(c, t) _FCN(F_FSIN, (c), (int)sizeof(t)) |
232 | #define _FCNW(c, t) _FCN(F_FSOUT, (c), (int)sizeof(t)) |
233 | #define _FCNRW(c, t) _FCN(F_FSINOUT, (c), (int)sizeof(t)) |
234 | |
235 | /* |
236 | * Define command macros for fs-specific commands. |
237 | */ |
238 | #define _FCN_FSPRIV(inout, fs, num, len) \ |
239 | (F_FSCTL | F_FSPRIV | inout | ((len & F_PARAM_MASK) << 16) | \ |
240 | (fs) << 8 | (num)) |
241 | #define _FCNO_FSPRIV(f, c) _FCN_FSPRIV(F_FSVOID, (f), (c), 0) |
242 | #define _FCNR_FSPRIV(f, c, t) _FCN_FSPRIV(F_FSIN, (f), (c), (int)sizeof(t)) |
243 | #define _FCNW_FSPRIV(f, c, t) _FCN_FSPRIV(F_FSOUT, (f), (c), (int)sizeof(t)) |
244 | #define _FCNRW_FSPRIV(f, c, t) _FCN_FSPRIV(F_FSINOUT, (f), (c), (int)sizeof(t)) |
245 | |
246 | #endif /* _NETBSD_SOURCE */ |
247 | |
248 | /* |
249 | * Advisory file segment locking data type - |
250 | * information passed to system by user |
251 | */ |
252 | struct flock { |
253 | off_t l_start; /* starting offset */ |
254 | off_t l_len; /* len = 0 means until end of file */ |
255 | pid_t l_pid; /* lock owner */ |
256 | short l_type; /* lock type: read/write, etc. */ |
257 | short l_whence; /* type of l_start */ |
258 | }; |
259 | |
260 | |
261 | #if defined(_NETBSD_SOURCE) |
262 | /* lock operations for flock(2) */ |
263 | #define LOCK_SH 0x01 /* shared file lock */ |
264 | #define LOCK_EX 0x02 /* exclusive file lock */ |
265 | #define LOCK_NB 0x04 /* don't block when locking */ |
266 | #define LOCK_UN 0x08 /* unlock file */ |
267 | #endif |
268 | |
269 | /* Always ensure that these are consistent with <stdio.h> and <unistd.h>! */ |
270 | #ifndef SEEK_SET |
271 | #define SEEK_SET 0 /* set file offset to offset */ |
272 | #endif |
273 | #ifndef SEEK_CUR |
274 | #define SEEK_CUR 1 /* set file offset to current plus offset */ |
275 | #endif |
276 | #ifndef SEEK_END |
277 | #define SEEK_END 2 /* set file offset to EOF plus offset */ |
278 | #endif |
279 | |
280 | /* |
281 | * posix_advise advisories. |
282 | */ |
283 | |
284 | #define POSIX_FADV_NORMAL 0 /* default advice / no advice */ |
285 | #define POSIX_FADV_RANDOM 1 /* random access */ |
286 | #define POSIX_FADV_SEQUENTIAL 2 /* sequential access(lower to higher) */ |
287 | #define POSIX_FADV_WILLNEED 3 /* be needed in near future */ |
288 | #define POSIX_FADV_DONTNEED 4 /* not be needed in near future */ |
289 | #define POSIX_FADV_NOREUSE 5 /* be accessed once */ |
290 | |
291 | /* |
292 | * Constants for X/Open Extended API set 2 (a.k.a. C063) |
293 | */ |
294 | #if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0 >= 700) || \ |
295 | defined(_INCOMPLETE_XOPEN_C063) || defined(_NETBSD_SOURCE) |
296 | #define AT_FDCWD -100 /* Use cwd for relative link target */ |
297 | #define AT_EACCESS 0x100 /* Use euig/egid for access checks */ |
298 | #define AT_SYMLINK_NOFOLLOW 0x200 /* Do not follow symlinks */ |
299 | #define AT_SYMLINK_FOLLOW 0x400 /* Follow symlinks */ |
300 | #define AT_REMOVEDIR 0x800 /* Remove directory only */ |
301 | #endif |
302 | |
303 | |
304 | #ifndef _KERNEL |
305 | #include <sys/cdefs.h> |
306 | |
307 | __BEGIN_DECLS |
308 | int open(const char *, int, ...); |
309 | int creat(const char *, mode_t); |
310 | int fcntl(int, int, ...); |
311 | #if defined(_NETBSD_SOURCE) |
312 | int flock(int, int); |
313 | #endif /* _NETBSD_SOURCE */ |
314 | int posix_fadvise(int, off_t, off_t, int); |
315 | |
316 | /* |
317 | * The Open Group Base Specifications, Issue 6; IEEE Std 1003.1-2001 (POSIX) |
318 | */ |
319 | #if (_POSIX_C_SOURCE - 0) >= 200112L || (_XOPEN_SOURCE - 0) >= 600 || \ |
320 | defined(_NETBSD_SOURCE) |
321 | int posix_fallocate(int, off_t, off_t); |
322 | #endif |
323 | |
324 | /* |
325 | * X/Open Extended API set 2 (a.k.a. C063) |
326 | */ |
327 | #if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0 >= 700) || \ |
328 | defined(_INCOMPLETE_XOPEN_C063) || defined(_NETBSD_SOURCE) |
329 | int openat(int, const char *, int, ...); |
330 | #endif |
331 | |
332 | __END_DECLS |
333 | #endif /* !_KERNEL */ |
334 | |
335 | #endif /* !_SYS_FCNTL_H_ */ |
336 | |