1    	/* O_*, F_*, FD_* bit values for Linux/x86-64.
2    	   Copyright (C) 2001,2002,2004,2006,2007,2009,2010
3    	   Free Software Foundation, Inc.
4    	   This file is part of the GNU C Library.
5    	
6    	   The GNU C Library is free software; you can redistribute it and/or
7    	   modify it under the terms of the GNU Lesser General Public
8    	   License as published by the Free Software Foundation; either
9    	   version 2.1 of the License, or (at your option) any later version.
10   	
11   	   The GNU C Library is distributed in the hope that it will be useful,
12   	   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   	   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   	   Lesser General Public License for more details.
15   	
16   	   You should have received a copy of the GNU Lesser General Public
17   	   License along with the GNU C Library; if not, write to the Free
18   	   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19   	   02111-1307 USA.  */
20   	
21   	#ifndef	_FCNTL_H
22   	# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
23   	#endif
24   	
25   	#include <sys/types.h>
26   	#include <bits/wordsize.h>
27   	#ifdef __USE_GNU
28   	# include <bits/uio.h>
29   	#endif
30   	
31   	
32   	/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
33   	   located on a few file systems.  */
34   	#define O_ACCMODE	   0003
35   	#define O_RDONLY	     00
36   	#define O_WRONLY	     01
37   	#define O_RDWR		     02
38   	#define O_CREAT		   0100	/* not fcntl */
39   	#define O_EXCL		   0200	/* not fcntl */
40   	#define O_NOCTTY	   0400	/* not fcntl */
41   	#define O_TRUNC		  01000	/* not fcntl */
42   	#define O_APPEND	  02000
43   	#define O_NONBLOCK	  04000
44   	#define O_NDELAY	O_NONBLOCK
45   	#define O_SYNC	       04010000
46   	#define O_FSYNC		 O_SYNC
47   	#define O_ASYNC		 020000
48   	
49   	#ifdef __USE_XOPEN2K8
50   	# define O_DIRECTORY	0200000	/* Must be a directory.	 */
51   	# define O_NOFOLLOW	0400000	/* Do not follow links.	 */
52   	# define O_CLOEXEC     02000000 /* Set close_on_exec.  */
53   	#endif
54   	#ifdef __USE_GNU
55   	# define O_DIRECT	 040000	/* Direct disk access.	*/
56   	# define O_NOATIME     01000000 /* Do not set atime.  */
57   	#endif
58   	
59   	/* For now Linux has synchronisity options for data and read operations.
60   	   We define the symbols here but let them do the same as O_SYNC since
61   	   this is a superset.	*/
62   	#if defined __USE_POSIX199309 || defined __USE_UNIX98
63   	# define O_DSYNC	010000	/* Synchronize data.  */
64   	# define O_RSYNC	O_SYNC	/* Synchronize read operations.	 */
65   	#endif
66   	
67   	#ifdef __USE_LARGEFILE64
68   	# if __WORDSIZE == 64
69   	#  define O_LARGEFILE	0
70   	# else
71   	#  define O_LARGEFILE	0100000
72   	# endif
73   	#endif
74   	
75   	/* Values for the second argument to `fcntl'.  */
76   	#define F_DUPFD		0	/* Duplicate file descriptor.  */
77   	#define F_GETFD		1	/* Get file descriptor flags.  */
78   	#define F_SETFD		2	/* Set file descriptor flags.  */
79   	#define F_GETFL		3	/* Get file status flags.  */
80   	#define F_SETFL		4	/* Set file status flags.  */
81   	#if __WORDSIZE == 64
82   	# define F_GETLK	5	/* Get record locking info.  */
83   	# define F_SETLK	6	/* Set record locking info (non-blocking).  */
84   	# define F_SETLKW	7	/* Set record locking info (blocking).	*/
85   	/* Not necessary, we always have 64-bit offsets.  */
86   	# define F_GETLK64	5	/* Get record locking info.  */
87   	# define F_SETLK64	6	/* Set record locking info (non-blocking).  */
88   	# define F_SETLKW64	7	/* Set record locking info (blocking).	*/
89   	#else
90   	# ifndef __USE_FILE_OFFSET64
91   	#  define F_GETLK	5	/* Get record locking info.  */
92   	#  define F_SETLK	6	/* Set record locking info (non-blocking).  */
93   	#  define F_SETLKW	7	/* Set record locking info (blocking).	*/
94   	# else
95   	#  define F_GETLK	F_GETLK64  /* Get record locking info.	*/
96   	#  define F_SETLK	F_SETLK64  /* Set record locking info (non-blocking).*/
97   	#  define F_SETLKW	F_SETLKW64 /* Set record locking info (blocking).  */
98   	# endif
99   	# define F_GETLK64	12	/* Get record locking info.  */
100  	# define F_SETLK64	13	/* Set record locking info (non-blocking).  */
101  	# define F_SETLKW64	14	/* Set record locking info (blocking).	*/
102  	#endif
103  	
104  	#if defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K8
105  	# define F_SETOWN	8	/* Get owner (process receiving SIGIO).  */
106  	# define F_GETOWN	9	/* Set owner (process receiving SIGIO).  */
107  	#endif
108  	
109  	#ifdef __USE_GNU
110  	# define F_SETSIG	10	/* Set number of signal to be sent.  */
111  	# define F_GETSIG	11	/* Get number of signal to be sent.  */
112  	# define F_SETOWN_EX	15	/* Get owner (thread receiving SIGIO).  */
113  	# define F_GETOWN_EX	16	/* Set owner (thread receiving SIGIO).  */
114  	#endif
115  	
116  	#ifdef __USE_GNU
117  	# define F_SETLEASE	1024	/* Set a lease.	 */
118  	# define F_GETLEASE	1025	/* Enquire what lease is active.  */
119  	# define F_NOTIFY	1026	/* Request notfications on a directory.	 */
120  	#endif
121  	#ifdef __USE_XOPEN2K8
122  	# define F_DUPFD_CLOEXEC 1030	/* Duplicate file descriptor with
123  					   close-on-exit set.  */
124  	#endif
125  	
126  	/* For F_[GET|SET]FD.  */
127  	#define FD_CLOEXEC	1	/* actually anything with low bit set goes */
128  	
129  	/* For posix fcntl() and `l_type' field of a `struct flock' for lockf().  */
130  	#define F_RDLCK		0	/* Read lock.  */
131  	#define F_WRLCK		1	/* Write lock.	*/
132  	#define F_UNLCK		2	/* Remove lock.	 */
133  	
134  	/* For old implementation of bsd flock().  */
135  	#define F_EXLCK		4	/* or 3 */
136  	#define F_SHLCK		8	/* or 4 */
137  	
138  	#ifdef __USE_BSD
139  	/* Operations for bsd flock(), also used by the kernel implementation.	*/
140  	# define LOCK_SH	1	/* shared lock */
141  	# define LOCK_EX	2	/* exclusive lock */
142  	# define LOCK_NB	4	/* or'd with one of the above to prevent
143  					   blocking */
144  	# define LOCK_UN	8	/* remove lock */
145  	#endif
146  	
147  	#ifdef __USE_GNU
148  	# define LOCK_MAND	32	/* This is a mandatory flock:	*/
149  	# define LOCK_READ	64	/* ... which allows concurrent read operations.	 */
150  	# define LOCK_WRITE	128	/* ... which allows concurrent write operations.  */
151  	# define LOCK_RW	192	/* ... Which allows concurrent read & write operations.	 */
152  	#endif
153  	
154  	#ifdef __USE_GNU
155  	/* Types of directory notifications that may be requested with F_NOTIFY.  */
156  	# define DN_ACCESS	0x00000001	/* File accessed.  */
157  	# define DN_MODIFY	0x00000002	/* File modified.  */
158  	# define DN_CREATE	0x00000004	/* File created.  */
159  	# define DN_DELETE	0x00000008	/* File removed.  */
160  	# define DN_RENAME	0x00000010	/* File renamed.  */
161  	# define DN_ATTRIB	0x00000020	/* File changed attibutes.  */
162  	# define DN_MULTISHOT	0x80000000	/* Don't remove notifier.  */
163  	#endif
164  	
165  	struct flock
166  	  {
167  	    short int l_type;	/* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.	*/
168  	    short int l_whence;	/* Where `l_start' is relative to (like `lseek').  */
169  	#ifndef __USE_FILE_OFFSET64
170  	    __off_t l_start;	/* Offset where the lock begins.  */
171  	    __off_t l_len;	/* Size of the locked area; zero means until EOF.  */
172  	#else
173  	    __off64_t l_start;	/* Offset where the lock begins.  */
174  	    __off64_t l_len;	/* Size of the locked area; zero means until EOF.  */
175  	#endif
176  	    __pid_t l_pid;	/* Process holding the lock.  */
177  	  };
178  	
179  	#ifdef __USE_LARGEFILE64
180  	struct flock64
181  	  {
182  	    short int l_type;	/* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.	*/
183  	    short int l_whence;	/* Where `l_start' is relative to (like `lseek').  */
184  	    __off64_t l_start;	/* Offset where the lock begins.  */
185  	    __off64_t l_len;	/* Size of the locked area; zero means until EOF.  */
186  	    __pid_t l_pid;	/* Process holding the lock.  */
187  	  };
188  	#endif
189  	
190  	#ifdef __USE_GNU
191  	/* Owner types.  */
192  	enum __pid_type
193  	  {
194  	    F_OWNER_TID = 0,		/* Kernel thread.  */
195  	    F_OWNER_PID,		/* Process.  */
196  	    F_OWNER_PGRP,		/* Process group.  */
197  	    F_OWNER_GID = F_OWNER_PGRP	/* Alternative, obsolete name.  */
198  	  };
199  	
200  	/* Structure to use with F_GETOWN_EX and F_SETOWN_EX.  */
201  	struct f_owner_ex
202  	  {
203  	    enum __pid_type type;	/* Owner type of ID.  */
204  	    __pid_t pid;		/* ID of owner.  */
205  	  };
206  	#endif
207  	
208  	/* Define some more compatibility macros to be backward compatible with
209  	   BSD systems which did not managed to hide these kernel macros.  */
210  	#ifdef	__USE_BSD
211  	# define FAPPEND	O_APPEND
212  	# define FFSYNC		O_FSYNC
213  	# define FASYNC		O_ASYNC
214  	# define FNONBLOCK	O_NONBLOCK
215  	# define FNDELAY	O_NDELAY
216  	#endif /* Use BSD.  */
217  	
218  	/* Advise to `posix_fadvise'.  */
219  	#ifdef __USE_XOPEN2K
220  	# define POSIX_FADV_NORMAL	0 /* No further special treatment.  */
221  	# define POSIX_FADV_RANDOM	1 /* Expect random page references.  */
222  	# define POSIX_FADV_SEQUENTIAL	2 /* Expect sequential page references.	 */
223  	# define POSIX_FADV_WILLNEED	3 /* Will need these pages.  */
224  	# define POSIX_FADV_DONTNEED	4 /* Don't need these pages.  */
225  	# define POSIX_FADV_NOREUSE	5 /* Data will be accessed once.  */
226  	#endif
227  	
228  	
229  	#ifdef __USE_GNU
230  	/* Flags for SYNC_FILE_RANGE.  */
231  	# define SYNC_FILE_RANGE_WAIT_BEFORE	1 /* Wait upon writeout of all pages
232  						     in the range before performing the
233  						     write.  */
234  	# define SYNC_FILE_RANGE_WRITE		2 /* Initiate writeout of all those
235  						     dirty pages in the range which are
236  						     not presently under writeback.  */
237  	# define SYNC_FILE_RANGE_WAIT_AFTER	4 /* Wait upon writeout of all pages in
238  						     the range after performing the
239  						     write.  */
240  	
241  	/* Flags for SPLICE and VMSPLICE.  */
242  	# define SPLICE_F_MOVE		1	/* Move pages instead of copying.  */
243  	# define SPLICE_F_NONBLOCK	2	/* Don't block on the pipe splicing
244  						   (but we may still block on the fd
245  						   we splice from/to).  */
246  	# define SPLICE_F_MORE		4	/* Expect more data.  */
247  	# define SPLICE_F_GIFT		8	/* Pages passed in are a gift.  */
248  	#endif
249  	
250  	__BEGIN_DECLS
251  	
252  	#ifdef __USE_GNU
253  	
254  	/* Provide kernel hint to read ahead.  */
255  	extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
256  	    __THROW;
257  	
258  	
259  	/* Selective file content synch'ing.  */
260  	extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count,
261  				    unsigned int __flags);
262  	
263  	
264  	/* Splice address range into a pipe.  */
265  	extern ssize_t vmsplice (int __fdout, const struct iovec *__iov,
266  				 size_t __count, unsigned int __flags);
267  	
268  	/* Splice two files together.  */
269  	extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
270  			       __off64_t *__offout, size_t __len,
271  			       unsigned int __flags);
272  	
273  	/* In-kernel implementation of tee for pipe buffers.  */
274  	extern ssize_t tee (int __fdin, int __fdout, size_t __len,
275  			    unsigned int __flags);
276  	
277  	/* Reserve storage for the data of the file associated with FD.  */
278  	# ifndef __USE_FILE_OFFSET64
279  	extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len);
280  	# else
281  	#  ifdef __REDIRECT
282  	extern int __REDIRECT (fallocate, (int __fd, int __mode, __off64_t __offset,
283  					   __off64_t __len),
284  			       fallocate64);
285  	#  else
286  	#   define fallocate fallocate64
287  	#  endif
288  	# endif
289  	# ifdef __USE_LARGEFILE64
290  	extern int fallocate64 (int __fd, int __mode, __off64_t __offset,
291  				__off64_t __len);
292  	# endif
293  	#endif
294  	
295  	__END_DECLS
296