1 /* O_*, F_*, FD_* bit values for GNU.
2    Copyright (C) 1993-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #ifndef _FCNTL_H
20 # error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
21 #endif
22 
23 #include <sys/types.h>
24 
25 /* File access modes.  These are understood by io servers; they can be
26    passed in `dir_lookup', and are returned by `io_get_openmodes'.
27    Consequently they can be passed to `open', `hurd_file_name_lookup', and
28    `file_name_lookup'; and are returned by `fcntl' with the F_GETFL
29    command.  */
30 
31 /* In GNU, read and write are bits (unlike BSD).  */
32 #ifdef __USE_GNU
33 # define O_READ		O_RDONLY /* Open for reading.  */
34 # define O_WRITE	O_WRONLY /* Open for writing.  */
35 # define O_EXEC		0x0004	/* Open for execution.  */
36 # define O_NORW		0	/* Open without R/W access.  */
37 #endif
38 /* POSIX.1 standard names.  */
39 #define	O_RDONLY	0x0001	/* Open read-only.  */
40 #define	O_WRONLY	0x0002	/* Open write-only.  */
41 #define	O_RDWR		(O_RDONLY|O_WRONLY) /* Open for reading and writing. */
42 #define	O_ACCMODE	O_RDWR	/* Mask for file access modes.  */
43 
44 #define O_LARGEFILE	0
45 
46 
47 /* File name translation flags.  These are understood by io servers;
48    they can be passed in `dir_lookup', and consequently to `open',
49    `hurd_file_name_lookup', and `file_name_lookup'.  */
50 
51 #define	O_CREAT		0x0010	/* Create file if it doesn't exist.  */
52 #define	O_EXCL		0x0020	/* Fail if file already exists.  */
53 #ifdef __USE_GNU
54 # define O_NOLINK	0x0040	/* No name mappings on final component.  */
55 # define O_NOTRANS	0x0080	/* No translator on final component. */
56 #endif
57 
58 #ifdef __USE_XOPEN2K8
59 # define O_NOFOLLOW	0x00100000 /* Produce ENOENT if file is a symlink.  */
60 # define O_DIRECTORY	0x00200000 /* Produce ENOTDIR if not a directory.  */
61 #endif
62 
63 
64 /* I/O operating modes.  These are understood by io servers; they can be
65    passed in `dir_lookup' and set or fetched with `io_*_openmodes'.
66    Consequently they can be passed to `open', `hurd_file_name_lookup',
67    `file_name_lookup', and `fcntl' with the F_SETFL command; and are
68    returned by `fcntl' with the F_GETFL command.  */
69 
70 #define	O_APPEND	0x0100	/* Writes always append to the file.  */
71 #define O_ASYNC		0x0200	/* Send SIGIO to owner when data is ready.  */
72 #define O_FSYNC		0x0400	/* Synchronous writes.  */
73 #define O_SYNC		O_FSYNC
74 #ifdef __USE_GNU
75 # define O_NOATIME	0x0800	/* Don't set access time on read (owner).  */
76 #endif
77 #ifdef	__USE_MISC
78 # define O_SHLOCK	0x00020000 /* Open with shared file lock.  */
79 # define O_EXLOCK	0x00040000 /* Open with exclusive file lock.  */
80 #endif
81 
82 /* These are lesser flavors of partial synchronization that are
83    implied by our one flag (O_FSYNC).  */
84 #if defined __USE_POSIX199309 || defined __USE_UNIX98
85 # define O_DSYNC	O_SYNC	/* Synchronize data.  */
86 # define O_RSYNC	O_SYNC	/* Synchronize read operations.	 */
87 #endif
88 
89 
90 /* The name O_NONBLOCK is unfortunately overloaded; it is both a file name
91    translation flag and an I/O operating mode.  O_NDELAY is the deprecated
92    BSD name for the same flag, overloaded in the same way.
93 
94    When used in `dir_lookup' (and consequently `open', `hurd_file_name_lookup',
95    or `file_name_lookup'), O_NONBLOCK says the open should return immediately
96    instead of blocking for any significant length of time (e.g., to wait
97    for carrier detect on a serial line).  It is also saved as an I/O
98    operating mode, and after open has the following meaning.
99 
100    When used in `io_*_openmodes' (and consequently `fcntl' with the F_SETFL
101    command), the O_NONBLOCK flag means to do nonblocking i/o: any i/o
102    operation that would block for any significant length of time will instead
103    fail with EAGAIN.  */
104 
105 #define	O_NONBLOCK	0x0008	/* Non-blocking open or non-blocking I/O.  */
106 #ifdef __USE_MISC
107 # define O_NDELAY	O_NONBLOCK /* Deprecated.  */
108 #endif
109 
110 
111 #ifdef __USE_GNU
112 /* Mask of bits which are understood by io servers.  */
113 # define O_HURD		(0xffff | O_EXLOCK | O_SHLOCK)
114 #endif
115 
116 
117 /* Open-time action flags.  These are understood by `hurd_file_name_lookup'
118    and consequently by `open' and `file_name_lookup'.  They are not preserved
119    once the file has been opened.  */
120 
121 #define	O_TRUNC		0x00010000 /* Truncate file to zero length.  */
122 #ifdef __USE_XOPEN2K8
123 # define O_CLOEXEC	0x00400000 /* Set FD_CLOEXEC.  */
124 #endif
125 
126 
127 /* Controlling terminal flags.  These are understood only by `open',
128    and are not preserved once the file has been opened.  */
129 
130 #ifdef __USE_GNU
131 # define O_IGNORE_CTTY	0x00080000 /* Don't do any ctty magic at all.  */
132 #endif
133 /* `open' never assigns a controlling terminal in GNU.  */
134 #define	O_NOCTTY	0	/* Don't assign a controlling terminal.  */
135 
136 
137 #ifdef __USE_MISC
138 /* Flags for TIOCFLUSH.  */
139 # define FREAD		O_RDONLY
140 # define FWRITE		O_WRONLY
141 
142 /* Traditional BSD names the O_* bits.  */
143 # define FASYNC		O_ASYNC
144 # define FCREAT		O_CREAT
145 # define FEXCL		O_EXCL
146 # define FTRUNC		O_TRUNC
147 # define FNOCTTY	O_NOCTTY
148 # define FFSYNC		O_FSYNC
149 # define FSYNC		O_SYNC
150 # define FAPPEND	O_APPEND
151 # define FNONBLOCK	O_NONBLOCK
152 # define FNDELAY	O_NDELAY
153 #endif
154 
155 
156 /* Values for the second argument to `fcntl'.  */
157 #define	F_DUPFD	  	0	/* Duplicate file descriptor.  */
158 #define	F_GETFD		1	/* Get file descriptor flags.  */
159 #define	F_SETFD		2	/* Set file descriptor flags.  */
160 #define	F_GETFL		3	/* Get file status flags.  */
161 #define	F_SETFL		4	/* Set file status flags.  */
162 #if defined __USE_UNIX98 || defined __USE_XOPEN2K8
163 # define F_GETOWN	5	/* Get owner (receiver of SIGIO).  */
164 # define F_SETOWN	6	/* Set owner (receiver of SIGIO).  */
165 #endif
166 #ifdef __USE_FILE_OFFSET64
167 # define	F_GETLK		F_GETLK64
168 # define	F_SETLK		F_SETLK64
169 # define	F_SETLKW	F_SETLKW64
170 #else
171 # define	F_GETLK		7	/* Get record locking info.  */
172 # define	F_SETLK		8	/* Set record locking info (non-blocking).  */
173 # define	F_SETLKW	9	/* Set record locking info (blocking).  */
174 #endif
175 #define	F_GETLK64	10	/* Get record locking info.  */
176 #define	F_SETLK64	11	/* Set record locking info (non-blocking).  */
177 #define	F_SETLKW64	12	/* Set record locking info (blocking).  */
178 
179 #ifdef __USE_XOPEN2K8
180 # define F_DUPFD_CLOEXEC 1030	/* Duplicate, set FD_CLOEXEC on new one.  */
181 #endif
182 
183 
184 /* File descriptor flags used with F_GETFD and F_SETFD.  */
185 #define	FD_CLOEXEC	1	/* Close on exec.  */
186 
187 
188 #include <bits/types.h>
189 
190 /* The structure describing an advisory lock.  This is the type of the third
191    argument to `fcntl' for the F_GETLK, F_SETLK, and F_SETLKW requests.  */
192 struct flock
193   {
194     int l_type;		/* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
195     int l_whence;	/* Where `l_start' is relative to (like `lseek').  */
196 #ifndef __USE_FILE_OFFSET64
197     __off_t l_start;	/* Offset where the lock begins.  */
198     __off_t l_len;	/* Size of the locked area; zero means until EOF.  */
199 #else
200     __off64_t l_start;	/* Offset where the lock begins.  */
201     __off64_t l_len;	/* Size of the locked area; zero means until EOF.  */
202 #endif
203     __pid_t l_pid;	/* Process holding the lock.  */
204   };
205 
206 #ifdef __USE_LARGEFILE64
207 struct flock64
208   {
209     int l_type;		/* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
210     int l_whence;	/* Where `l_start' is relative to (like `lseek').  */
211     __off64_t l_start;	/* Offset where the lock begins.  */
212     __off64_t l_len;	/* Size of the locked area; zero means until EOF.  */
213     __pid_t l_pid;	/* Process holding the lock.  */
214   };
215 #endif
216 
217 /* Values for the `l_type' field of a `struct flock'.  */
218 #define	F_RDLCK	1	/* Read lock.  */
219 #define	F_WRLCK	2	/* Write lock.  */
220 #define	F_UNLCK	3	/* Remove lock.  */
221 
222 /* Advise to `posix_fadvise'.  */
223 #ifdef __USE_XOPEN2K
224 # define POSIX_FADV_NORMAL	0 /* No further special treatment.  */
225 # define POSIX_FADV_RANDOM	1 /* Expect random page references.  */
226 # define POSIX_FADV_SEQUENTIAL	2 /* Expect sequential page references.  */
227 # define POSIX_FADV_WILLNEED	3 /* Will need these pages.  */
228 # define POSIX_FADV_DONTNEED	4 /* Don't need these pages.  */
229 # define POSIX_FADV_NOREUSE	5 /* Data will be accessed once.  */
230 #endif
231