1 /*        $NetBSD: fcntl.h,v 1.55 2023/07/10 02:31:55 christos 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(_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 #define   O_EXEC              0x04000000          /* open for executing only */
125 #endif
126 
127 #ifdef _KERNEL
128 /* convert from open() flags to/from fflags; convert O_RD/WR to FREAD/FWRITE */
129 #define   FFLAGS(oflags)      ((oflags) + 1)
130 #define   OFLAGS(fflags)      ((fflags) - 1)
131 
132 /* all bits settable during open(2) */
133 #define   O_MASK              (O_ACCMODE|O_NONBLOCK|O_APPEND|O_SHLOCK|O_EXLOCK|\
134                                O_ASYNC|O_SYNC|O_CREAT|O_TRUNC|O_EXCL|O_DSYNC|\
135                                O_RSYNC|O_NOCTTY|O_ALT_IO|O_NOFOLLOW|O_DIRECT|\
136                                O_DIRECTORY|O_CLOEXEC|O_NOSIGPIPE|O_REGULAR|O_EXEC)
137 
138 #define   FEXEC               O_EXEC
139 #define   FMARK               0x00001000          /* mark during gc() */
140 #define   FDEFER              0x00002000          /* defer for next gc pass */
141 #define   FHASLOCK  0x00004000          /* descriptor holds advisory lock */
142 #define   FSCAN               0x00100000          /* scan during gc passes */
143 #define   FSILENT             0x40000000          /* suppress kernel error messages */
144 #define   FKIOCTL             0x80000000          /* kernel originated ioctl */
145 /* bits settable by fcntl(F_SETFL, ...) */
146 #define   FCNTLFLAGS          (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FDSYNC|FRSYNC|FALTIO|\
147                                FDIRECT|FNOSIGPIPE)
148 /* bits to save after open(2) */
149 #define   FMASK               (FREAD|FWRITE|FCNTLFLAGS|FEXEC)
150 #endif /* _KERNEL */
151 
152 /*
153  * The O_* flags used to have only F* names, which were used in the kernel
154  * and by fcntl.  We retain the F* names for the kernel f_flags field
155  * and for backward compatibility for fcntl.
156  */
157 #if defined(_NETBSD_SOURCE)
158 #define   FAPPEND             O_APPEND  /* kernel/compat */
159 #define   FASYNC              O_ASYNC             /* kernel/compat */
160 #define   O_FSYNC             O_SYNC              /* compat */
161 #define   FNDELAY             O_NONBLOCK          /* compat */
162 #define   O_NDELAY  O_NONBLOCK          /* compat */
163 #endif
164 #if defined(_KERNEL)
165 #define   FNOSIGPIPE          O_NOSIGPIPE         /* kernel */
166 #define   FNONBLOCK O_NONBLOCK          /* kernel */
167 #define   FFSYNC              O_SYNC              /* kernel */
168 #define   FDSYNC              O_DSYNC             /* kernel */
169 #define   FRSYNC              O_RSYNC             /* kernel */
170 #define   FALTIO              O_ALT_IO  /* kernel */
171 #define   FDIRECT             O_DIRECT  /* kernel */
172 #endif
173 
174 /*
175  * Constants used for fcntl(2)
176  */
177 
178 /* command values */
179 #define   F_DUPFD             0                   /* duplicate file descriptor */
180 #define   F_GETFD             1                   /* get file descriptor flags */
181 #define   F_SETFD             2                   /* set file descriptor flags */
182 #define   F_GETFL             3                   /* get file status flags */
183 #define   F_SETFL             4                   /* set file status flags */
184 #if (_POSIX_C_SOURCE - 0) >= 200112L || (_XOPEN_SOURCE - 0) >= 500 || \
185     defined(_NETBSD_SOURCE)
186 #define   F_GETOWN  5                   /* get SIGIO/SIGURG proc/pgrp */
187 #define   F_SETOWN  6                   /* set SIGIO/SIGURG proc/pgrp */
188 #endif
189 #define   F_GETLK             7                   /* get record locking information */
190 #define   F_SETLK             8                   /* set record locking information */
191 #define   F_SETLKW  9                   /* F_SETLK; wait if blocked */
192 #if defined(_NETBSD_SOURCE)
193 #define   F_CLOSEM  10                  /* close all fds >= to the one given */
194 #define   F_MAXFD             11                  /* return the max open fd */
195 #endif
196 #if (_POSIX_C_SOURCE - 0) >= 200809L || defined(_NETBSD_SOURCE)
197 #define   F_DUPFD_CLOEXEC     12                  /* close on exec duplicated fd */
198 #endif
199 #if defined(_NETBSD_SOURCE)
200 #define   F_GETNOSIGPIPE      13                  /* get SIGPIPE disposition */
201 #define   F_SETNOSIGPIPE      14                  /* set SIGPIPE disposition */
202 #define   F_GETPATH 15                  /* get pathname associated with fd */
203 #define   F_ADD_SEALS         16                  /* set seals */
204 #define   F_GET_SEALS         17                  /* get seals */
205 #endif
206 
207 /* file descriptor flags (F_GETFD, F_SETFD) */
208 #define   FD_CLOEXEC          1                   /* close-on-exec flag */
209 
210 /* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */
211 #define   F_RDLCK             1                   /* shared or read lock */
212 #define   F_UNLCK             2                   /* unlock */
213 #define   F_WRLCK             3                   /* exclusive or write lock */
214 #ifdef _KERNEL
215 #define   F_WAIT              0x010               /* Wait until lock is granted */
216 #define   F_FLOCK             0x020               /* Use flock(2) semantics for lock */
217 #define   F_POSIX             0x040               /* Use POSIX semantics for lock */
218 #endif
219 
220 /* types of seals (F_ADD_SEALS, F_GET_SEALS) */
221 #if defined(_NETBSD_SOURCE)
222 #define   F_SEAL_SEAL                   0x0001    /* prevent further seals from being set */
223 #define   F_SEAL_SHRINK                 0x0002    /* prevent file from shrinking */
224 #define   F_SEAL_GROW                   0x0004    /* prevent file from growing */
225 #define   F_SEAL_WRITE                  0x0008    /* prevent writes */
226 #define   F_SEAL_FUTURE_WRITE 0x0010    /* prevent future writes while mapped */
227 #endif
228 
229 /* Constants for fcntl's passed to the underlying fs - like ioctl's. */
230 #if defined(_NETBSD_SOURCE)
231 #define   F_PARAM_MASK        0xfff
232 #define   F_PARAM_LEN(x)      (((x) >> 16) & F_PARAM_MASK)
233 #define   F_PARAM_MAX         4095
234 #define   F_FSCTL             (int)0x80000000     /* This fcntl goes to the fs */
235 #define   F_FSVOID  (int)0x40000000     /* no parameters */
236 #define   F_FSOUT             (int)0x20000000     /* copy out parameter */
237 #define   F_FSIN              (int)0x10000000     /* copy in parameter */
238 #define   F_FSINOUT (F_FSIN | F_FSOUT)
239 #define   F_FSDIRMASK         (int)0x70000000     /* mask for IN/OUT/VOID */
240 #define   F_FSPRIV  (int)0x00008000     /* command is fs-specific */
241 
242 /*
243  * Define command macros for operations which, if implemented, must be
244  * the same for all fs's.
245  */
246 #define   _FCN(inout, num, len) \
247                     (F_FSCTL | inout | ((len & F_PARAM_MASK) << 16) | (num))
248 #define   _FCNO(c)  _FCN(F_FSVOID,      (c), 0)
249 #define   _FCNR(c, t)         _FCN(F_FSIN,        (c), (int)sizeof(t))
250 #define   _FCNW(c, t)         _FCN(F_FSOUT,       (c), (int)sizeof(t))
251 #define   _FCNRW(c, t)        _FCN(F_FSINOUT,     (c), (int)sizeof(t))
252 
253 /*
254  * Define command macros for fs-specific commands.
255  */
256 #define   _FCN_FSPRIV(inout, fs, num, len) \
257           (F_FSCTL | F_FSPRIV | inout | ((len & F_PARAM_MASK) << 16) |          \
258            (fs) << 8 | (num))
259 #define   _FCNO_FSPRIV(f, c)  _FCN_FSPRIV(F_FSVOID,  (f), (c), 0)
260 #define   _FCNR_FSPRIV(f, c, t)         _FCN_FSPRIV(F_FSIN,    (f), (c), (int)sizeof(t))
261 #define   _FCNW_FSPRIV(f, c, t)         _FCN_FSPRIV(F_FSOUT,   (f), (c), (int)sizeof(t))
262 #define   _FCNRW_FSPRIV(f, c, t)        _FCN_FSPRIV(F_FSINOUT, (f), (c), (int)sizeof(t))
263 
264 #endif /* _NETBSD_SOURCE */
265 
266 /*
267  * Advisory file segment locking data type -
268  * information passed to system by user
269  */
270 struct flock {
271           off_t     l_start;  /* starting offset */
272           off_t     l_len;              /* len = 0 means until end of file */
273           pid_t     l_pid;              /* lock owner */
274           short     l_type;             /* lock type: read/write, etc. */
275           short     l_whence; /* type of l_start */
276 };
277 
278 
279 #if defined(_NETBSD_SOURCE)
280 /* lock operations for flock(2) */
281 #define   LOCK_SH             0x01                /* shared file lock */
282 #define   LOCK_EX             0x02                /* exclusive file lock */
283 #define   LOCK_NB             0x04                /* don't block when locking */
284 #define   LOCK_UN             0x08                /* unlock file */
285 #endif
286 
287 /* Always ensure that these are consistent with <stdio.h> and <unistd.h>! */
288 #ifndef   SEEK_SET
289 #define   SEEK_SET  0         /* set file offset to offset */
290 #endif
291 #ifndef   SEEK_CUR
292 #define   SEEK_CUR  1         /* set file offset to current plus offset */
293 #endif
294 #ifndef   SEEK_END
295 #define   SEEK_END  2         /* set file offset to EOF plus offset */
296 #endif
297 
298 /*
299  * posix_advise advisories.
300  */
301 
302 #define   POSIX_FADV_NORMAL   0         /* default advice / no advice */
303 #define   POSIX_FADV_RANDOM   1         /* random access */
304 #define   POSIX_FADV_SEQUENTIAL         2         /* sequential access(lower to higher) */
305 #define   POSIX_FADV_WILLNEED 3         /* be needed in near future */
306 #define   POSIX_FADV_DONTNEED 4         /* not be needed in near future */
307 #define   POSIX_FADV_NOREUSE  5         /* be accessed once */
308 
309 /*
310  * Constants for X/Open Extended API set 2 (a.k.a. C063)
311  */
312 #if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0 >= 700) || \
313     defined(_NETBSD_SOURCE)
314 #define   AT_FDCWD            -100      /* Use cwd for relative link target */
315 #define   AT_EACCESS                    0x100     /* Use euig/egid for access checks */
316 #define   AT_SYMLINK_NOFOLLOW 0x200     /* Do not follow symlinks */
317 #define   AT_SYMLINK_FOLLOW   0x400     /* Follow symlinks */
318 #define   AT_REMOVEDIR                  0x800     /* Remove directory only */
319 #endif
320 
321 
322 #ifndef _KERNEL
323 #include <sys/cdefs.h>
324 
325 __BEGIN_DECLS
326 int       open(const char *, int, ...);
327 int       creat(const char *, mode_t);
328 int       fcntl(int, int, ...);
329 #if defined(_NETBSD_SOURCE)
330 int       flock(int, int);
331 #endif /* _NETBSD_SOURCE */
332 int       posix_fadvise(int, off_t, off_t, int);
333 
334 /*
335  * The Open Group Base Specifications, Issue 6; IEEE Std 1003.1-2001 (POSIX)
336  */
337 #if (_POSIX_C_SOURCE - 0) >= 200112L || (_XOPEN_SOURCE - 0) >= 600 || \
338     defined(_NETBSD_SOURCE)
339 int        posix_fallocate(int, off_t, off_t);
340 #endif
341 
342 /*
343  * X/Open Extended API set 2 (a.k.a. C063)
344  */
345 #if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0 >= 700) || \
346     defined(_NETBSD_SOURCE)
347 int       openat(int, const char *, int, ...);
348 #endif
349 
350 __END_DECLS
351 #endif /* !_KERNEL */
352 
353 #endif /* !_SYS_FCNTL_H_ */
354