Virtio_Balloon implementation for DragonFly
[dragonfly.git] / sys / sys / fcntl.h
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.
18  * 3. Neither the name of the University nor the names of its contributors
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
41 #include <sys/cdefs.h>
42 #ifndef _SYS_TYPES_H_
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  */
67 #if __BSD_VISIBLE
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 */
73 #if __BSD_VISIBLE
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 */
78 #endif
79 #define O_SYNC          0x0080          /* Same as O_FSYNC, but POSIX */
80 #if __POSIX_VISIBLE >= 200809
81 #define O_NOFOLLOW      0x0100          /* don't follow symlinks */
82 #endif
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 */
86 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
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
95 #if __BSD_VISIBLE
96 /* Attempt to bypass the buffer cache */
97 #define O_DIRECT        0x00010000
98 #endif
99
100 #if __POSIX_VISIBLE >= 200809
101 #define O_CLOEXEC       0x00020000      /* atomically set FD_CLOEXEC */
102 #endif
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 */
109 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
110 #define O_UNUSED24      0x01000000
111 #define O_UNUSED25      0x02000000
112 #define O_UNUSED26      0x04000000
113 #endif
114
115 #if __POSIX_VISIBLE >= 200809
116 #define O_DIRECTORY     0x08000000      /* error if not a directory */
117 #endif
118
119 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
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 */
124 #endif
125
126 #define O_FMASK         (O_FBLOCKING|O_FNONBLOCKING|O_FAPPEND|O_FOFFSET|\
127                          O_FSYNCWRITE|O_FASYNCWRITE)
128
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
134 /*
135  * Bits to save after open from the ap.  Remaining bits are retained.
136  */
137 #define FMASK           (FREAD|FWRITE|FAPPEND|FASYNC|FFSYNC|FNONBLOCK|\
138                          FAPPENDONLY|FREVOKED|O_DIRECT)
139 /* bits settable by fcntl(F_SETFL, ...) */
140 #define FCNTLFLAGS      (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FPOSIXSHM|\
141                          O_DIRECT)
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  */
149 #if __BSD_VISIBLE
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  */
164 #if __BSD_VISIBLE
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
174 #if __POSIX_VISIBLE >= 200809
175 /*
176  * Constants used by "at" family of system calls.
177  */
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
183 #endif
184
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 */
195 #if __XSI_VISIBLE || __POSIX_VISIBLE >= 200112
196 #define F_GETOWN        5               /* get SIGIO/SIGURG proc/pgrp */
197 #define F_SETOWN        6               /* set SIGIO/SIGURG proc/pgrp */
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 */
202 #if __BSD_VISIBLE
203 #define F_DUP2FD        10              /* duplicate file descriptor to arg */
204 #endif
205 #if __POSIX_VISIBLE >= 200809
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 */
210 #endif
211
212 /* file descriptor flags (F_GETFD, F_SETFD) */
213 #define FD_CLOEXEC      1               /* close-on-exec flag */
214
215 /* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */
216 #define F_RDLCK         1               /* shared or read lock */
217 #define F_UNLCK         2               /* unlock */
218 #define F_WRLCK         3               /* exclusive or write lock */
219 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
220 #define F_WAIT          0x010           /* Wait until lock is granted */
221 #define F_UNUSED020     0x020
222 #define F_POSIX         0x040           /* Use POSIX semantics for lock */
223 #define F_NOEND         0x080           /* l_len = 0, internally used */
224 #endif
225
226
227 /*
228  * Advisory file segment locking data type -
229  * information passed to system by user
230  */
231 struct flock {
232         off_t   l_start;        /* starting offset */
233         off_t   l_len;          /* len = 0 means until end of file */
234         pid_t   l_pid;          /* lock owner */
235         short   l_type;         /* lock type: read/write, etc. */
236         short   l_whence;       /* type of l_start */
237 };
238
239 #ifdef _KERNEL
240 union fcntl_dat {
241         int             fc_fd;          /* F_DUPFD */
242         int             fc_cloexec;     /* F_GETFD/F_SETFD */
243         int             fc_flags;       /* F_GETFL/F_SETFL */
244         int             fc_owner;       /* F_GETOWN/F_SETOWN */
245         struct flock    fc_flock;       /* F_GETLK/F_SETLK */
246 };
247 #endif /* _KERNEL */
248
249
250 #if __BSD_VISIBLE
251 /* lock operations for flock(2) */
252 #define LOCK_SH         0x01            /* shared file lock */
253 #define LOCK_EX         0x02            /* exclusive file lock */
254 #define LOCK_NB         0x04            /* don't block when locking */
255 #define LOCK_UN         0x08            /* unlock file */
256 #endif
257
258 /* Always ensure that these are consistent with <stdio.h> and <unistd.h>! */
259 #ifndef SEEK_SET
260 #define SEEK_SET        0       /* set file offset to offset */
261 #endif
262 #ifndef SEEK_CUR
263 #define SEEK_CUR        1       /* set file offset to current plus offset */
264 #endif
265 #ifndef SEEK_END
266 #define SEEK_END        2       /* set file offset to EOF plus offset */
267 #endif
268
269 /* Always ensure that these are consistent with <stat.h>! */
270 #ifndef S_ISUID
271 #define S_ISUID 0004000                 /* set user id on execution */
272 #endif
273 #ifndef S_ISGID
274 #define S_ISGID 0002000                 /* set group id on execution */
275 #endif
276 #ifndef S_IRWXU
277 #define S_IRWXU 0000700                 /* RWX mask for owner */
278 #endif
279 #ifndef S_IRUSR
280 #define S_IRUSR 0000400                 /* R for owner */
281 #endif
282 #ifndef S_IWUSR
283 #define S_IWUSR 0000200                 /* W for owner */
284 #endif
285 #ifndef S_IXUSR
286 #define S_IXUSR 0000100                 /* X for owner */
287 #endif
288 #ifndef S_IRWXG
289 #define S_IRWXG 0000070                 /* RWX mask for group */
290 #endif
291 #ifndef S_IRGRP
292 #define S_IRGRP 0000040                 /* R for group */
293 #endif
294 #ifndef S_IWGRP
295 #define S_IWGRP 0000020                 /* W for group */
296 #endif
297 #ifndef S_IXGRP
298 #define S_IXGRP 0000010                 /* X for group */
299 #endif
300 #ifndef S_IRWXO
301 #define S_IRWXO 0000007                 /* RWX mask for other */
302 #endif
303 #ifndef S_IROTH
304 #define S_IROTH 0000004                 /* R for other */
305 #endif
306 #ifndef S_IWOTH
307 #define S_IWOTH 0000002                 /* W for other */
308 #endif
309 #ifndef S_IXOTH
310 #define S_IXOTH 0000001                 /* X for other */
311 #endif
312
313 #if !defined(_KERNEL) || defined(_KERNEL_VIRTUAL)
314 __BEGIN_DECLS
315 int     open(const char *, int, ...);
316 #if __POSIX_VISIBLE >= 200809
317 int     openat(int, const char *, int, ...);
318 #endif
319 int     creat(const char *, mode_t);
320 int     fcntl(int, int, ...);
321 #if __BSD_VISIBLE
322 int     flock(int, int);
323 #endif /* __BSD_VISIBLE */
324 #if 0 /* XXX missing */
325 #if __POSIX_VISIBLE >= 200112
326 int     posix_fadvise(int, off_t, off_t, int);
327 int     posix_fallocate(int, off_t, off_t);
328 #endif
329 #endif
330 __END_DECLS
331 #endif
332
333 #endif /* !_SYS_FCNTL_H_ */