master
  1/* O_*, F_*, FD_* bit values for Linux.
  2   Copyright (C) 2001-2025 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-linux.h> directly; include <fcntl.h> instead."
 21#endif
 22
 23/* This file contains shared definitions between Linux architectures
 24   and is included by <bits/fcntl.h> to declare them.  The various
 25   #ifndef cases allow the architecture specific file to define those
 26   values with different values.
 27
 28   A minimal <bits/fcntl.h> contains just:
 29
 30   struct flock {...}
 31   #ifdef __USE_LARGEFILE64
 32   struct flock64 {...}
 33   #endif
 34   #include <bits/fcntl-linux.h>
 35*/
 36
 37#ifdef __USE_GNU
 38# include <bits/types/struct_iovec.h>
 39#endif
 40
 41/* open/fcntl.  */
 42#define O_ACCMODE	   0003
 43#define O_RDONLY	     00
 44#define O_WRONLY	     01
 45#define O_RDWR		     02
 46#ifndef O_CREAT
 47# define O_CREAT	   0100	/* Not fcntl.  */
 48#endif
 49#ifndef O_EXCL
 50# define O_EXCL		   0200	/* Not fcntl.  */
 51#endif
 52#ifndef O_NOCTTY
 53# define O_NOCTTY	   0400	/* Not fcntl.  */
 54#endif
 55#ifndef O_TRUNC
 56# define O_TRUNC	  01000	/* Not fcntl.  */
 57#endif
 58#ifndef O_APPEND
 59# define O_APPEND	  02000
 60#endif
 61#ifndef O_NONBLOCK
 62# define O_NONBLOCK	  04000
 63#endif
 64#ifndef O_NDELAY
 65# define O_NDELAY	O_NONBLOCK
 66#endif
 67#ifndef O_SYNC
 68# define O_SYNC	       04010000
 69#endif
 70#define O_FSYNC		O_SYNC
 71#ifndef O_ASYNC
 72# define O_ASYNC	 020000
 73#endif
 74#ifndef __O_LARGEFILE
 75# define __O_LARGEFILE	0100000
 76#endif
 77
 78#ifndef __O_DIRECTORY
 79# define __O_DIRECTORY	0200000
 80#endif
 81#ifndef __O_NOFOLLOW
 82# define __O_NOFOLLOW	0400000
 83#endif
 84#ifndef __O_CLOEXEC
 85# define __O_CLOEXEC   02000000
 86#endif
 87#ifndef __O_DIRECT
 88# define __O_DIRECT	 040000
 89#endif
 90#ifndef __O_NOATIME
 91# define __O_NOATIME   01000000
 92#endif
 93#ifndef __O_PATH
 94# define __O_PATH     010000000
 95#endif
 96#ifndef __O_DSYNC
 97# define __O_DSYNC	 010000
 98#endif
 99#ifndef __O_TMPFILE
100# define __O_TMPFILE   (020000000 | __O_DIRECTORY)
101#endif
102
103#ifndef F_GETLK
104# if !defined __USE_FILE_OFFSET64 && __TIMESIZE != 64
105#  define F_GETLK	5	/* Get record locking info.  */
106#  define F_SETLK	6	/* Set record locking info (non-blocking).  */
107#  define F_SETLKW	7	/* Set record locking info (blocking).  */
108# else
109#  define F_GETLK	F_GETLK64  /* Get record locking info.  */
110#  define F_SETLK	F_SETLK64  /* Set record locking info (non-blocking).*/
111#  define F_SETLKW	F_SETLKW64 /* Set record locking info (blocking).  */
112# endif
113#endif
114#ifndef F_GETLK64
115# define F_GETLK64	12	/* Get record locking info.  */
116# define F_SETLK64	13	/* Set record locking info (non-blocking).  */
117# define F_SETLKW64	14	/* Set record locking info (blocking).  */
118#endif
119
120/* open file description locks.
121
122   Usually record locks held by a process are released on *any* close and are
123   not inherited across a fork.
124
125   These cmd values will set locks that conflict with process-associated record
126   locks, but are "owned" by the opened file description, not the process.
127   This means that they are inherited across fork or clone with CLONE_FILES
128   like BSD (flock) locks, and they are only released automatically when the
129   last reference to the the file description against which they were acquired
130   is put. */
131#ifdef __USE_GNU
132# define F_OFD_GETLK	36
133# define F_OFD_SETLK	37
134# define F_OFD_SETLKW	38
135#endif
136
137#ifdef __USE_LARGEFILE64
138# define O_LARGEFILE __O_LARGEFILE
139#endif
140
141#ifdef __USE_XOPEN2K8
142# define O_DIRECTORY	__O_DIRECTORY	/* Must be a directory.  */
143# define O_NOFOLLOW	__O_NOFOLLOW	/* Do not follow links.  */
144# define O_CLOEXEC	__O_CLOEXEC	/* Set close_on_exec.  */
145#endif
146
147#ifdef __USE_GNU
148# define O_DIRECT	__O_DIRECT	/* Direct disk access.  */
149# define O_NOATIME	__O_NOATIME	/* Do not set atime.  */
150# define O_PATH		__O_PATH	/* Resolve pathname but do not open file.  */
151# define O_TMPFILE	__O_TMPFILE	/* Atomically create nameless file.  */
152#endif
153
154/* For now, Linux has no separate synchronicity options for read
155   operations.  We define O_RSYNC therefore as the same as O_SYNC
156   since this is a superset.  */
157#if defined __USE_POSIX199309 || defined __USE_UNIX98
158# define O_DSYNC	__O_DSYNC	/* Synchronize data.  */
159# if defined __O_RSYNC
160#  define O_RSYNC	__O_RSYNC	/* Synchronize read operations.  */
161# else
162#  define O_RSYNC	O_SYNC		/* Synchronize read operations.  */
163# endif
164#endif
165
166/* Values for the second argument to `fcntl'.  */
167#define F_DUPFD		0	/* Duplicate file descriptor.  */
168#define F_GETFD		1	/* Get file descriptor flags.  */
169#define F_SETFD		2	/* Set file descriptor flags.  */
170#define F_GETFL		3	/* Get file status flags.  */
171#define F_SETFL		4	/* Set file status flags.  */
172
173#ifndef __F_SETOWN
174# define __F_SETOWN	8
175# define __F_GETOWN	9
176#endif
177
178#if defined __USE_UNIX98 || defined __USE_XOPEN2K8
179# define F_SETOWN	__F_SETOWN /* Get owner (process receiving SIGIO).  */
180# define F_GETOWN	__F_GETOWN /* Set owner (process receiving SIGIO).  */
181#endif
182
183#ifndef __F_SETSIG
184# define __F_SETSIG	10	/* Set number of signal to be sent.  */
185# define __F_GETSIG	11	/* Get number of signal to be sent.  */
186#endif
187#ifndef __F_SETOWN_EX
188# define __F_SETOWN_EX	15	/* Get owner (thread receiving SIGIO).  */
189# define __F_GETOWN_EX	16	/* Set owner (thread receiving SIGIO).  */
190#endif
191
192#ifdef __USE_GNU
193# define F_SETSIG	__F_SETSIG	/* Set number of signal to be sent.  */
194# define F_GETSIG	__F_GETSIG	/* Get number of signal to be sent.  */
195# define F_SETOWN_EX	__F_SETOWN_EX	/* Get owner (thread receiving SIGIO).  */
196# define F_GETOWN_EX	__F_GETOWN_EX	/* Set owner (thread receiving SIGIO).  */
197#endif
198
199#ifdef __USE_GNU
200# define F_SETLEASE	1024	/* Set a lease.  */
201# define F_GETLEASE	1025	/* Enquire what lease is active.  */
202# define F_NOTIFY	1026	/* Request notifications on a directory.  */
203# define F_DUPFD_QUERY  1027    /* Compare two file descriptors for sameness.  */
204# define F_CREATED_QUERY 1028   /* Was the file just created?  */
205# define F_SETPIPE_SZ	1031	/* Set pipe page size array.  */
206# define F_GETPIPE_SZ	1032	/* Set pipe page size array.  */
207# define F_ADD_SEALS	1033	/* Add seals to file.  */
208# define F_GET_SEALS	1034	/* Get seals for file.  */
209/* Set / get write life time hints.  */
210# define F_GET_RW_HINT	1035
211# define F_SET_RW_HINT	1036
212# define F_GET_FILE_RW_HINT	1037
213# define F_SET_FILE_RW_HINT	1038
214#endif
215#ifdef __USE_XOPEN2K8
216# define F_DUPFD_CLOEXEC 1030	/* Duplicate file descriptor with
217				   close-on-exit set.  */
218#endif
219
220/* For F_[GET|SET]FD.  */
221#define FD_CLOEXEC	1	/* Actually anything with low bit set goes */
222
223#ifndef F_RDLCK
224/* For posix fcntl() and `l_type' field of a `struct flock' for lockf().  */
225# define F_RDLCK		0	/* Read lock.  */
226# define F_WRLCK		1	/* Write lock.  */
227# define F_UNLCK		2	/* Remove lock.  */
228#endif
229
230
231/* For old implementation of BSD flock.  */
232#ifndef F_EXLCK
233# define F_EXLCK		4	/* or 3 */
234# define F_SHLCK		8	/* or 4 */
235#endif
236
237#ifdef __USE_MISC
238/* Operations for BSD flock, also used by the kernel implementation.  */
239# define LOCK_SH	1	/* Shared lock.  */
240# define LOCK_EX	2	/* Exclusive lock.  */
241# define LOCK_NB	4	/* Or'd with one of the above to prevent
242				   blocking.  */
243# define LOCK_UN	8	/* Remove lock.  */
244#endif
245
246#ifdef __USE_GNU
247# define LOCK_MAND	32	/* This is a mandatory flock:  */
248# define LOCK_READ	64	/* ... which allows concurrent read operations.  */
249# define LOCK_WRITE	128	/* ... which allows concurrent write operations.  */
250# define LOCK_RW	192	/* ... Which allows concurrent read & write operations.  */
251#endif
252
253#ifdef __USE_GNU
254/* Types of directory notifications that may be requested with F_NOTIFY.  */
255# define DN_ACCESS	0x00000001	/* File accessed.  */
256# define DN_MODIFY	0x00000002	/* File modified.  */
257# define DN_CREATE	0x00000004	/* File created.  */
258# define DN_DELETE	0x00000008	/* File removed.  */
259# define DN_RENAME	0x00000010	/* File renamed.  */
260# define DN_ATTRIB	0x00000020	/* File changed attributes.  */
261# define DN_MULTISHOT	0x80000000	/* Don't remove notifier.  */
262#endif
263
264
265#ifdef __USE_GNU
266/* Owner types.  */
267enum __pid_type
268  {
269    F_OWNER_TID = 0,		/* Kernel thread.  */
270    F_OWNER_PID,		/* Process.  */
271    F_OWNER_PGRP,		/* Process group.  */
272    F_OWNER_GID = F_OWNER_PGRP	/* Alternative, obsolete name.  */
273  };
274
275/* Structure to use with F_GETOWN_EX and F_SETOWN_EX.  */
276struct f_owner_ex
277  {
278    enum __pid_type type;	/* Owner type of ID.  */
279    __pid_t pid;		/* ID of owner.  */
280  };
281#endif
282
283#ifdef __USE_GNU
284/* Types of seals.  */
285# define F_SEAL_SEAL	0x0001	/* Prevent further seals from being set.  */
286# define F_SEAL_SHRINK	0x0002	/* Prevent file from shrinking.  */
287# define F_SEAL_GROW	0x0004	/* Prevent file from growing.  */
288# define F_SEAL_WRITE	0x0008	/* Prevent writes.  */
289# define F_SEAL_FUTURE_WRITE	0x0010	/* Prevent future writes while
290					   mapped.  */
291# define F_SEAL_EXEC	0x0020	/* Prevent chmod modifying exec bits. */
292#endif
293
294#ifdef __USE_GNU
295/* Hint values for F_{GET,SET}_RW_HINT.  */
296# define RWH_WRITE_LIFE_NOT_SET	0
297# define RWF_WRITE_LIFE_NOT_SET	RWH_WRITE_LIFE_NOT_SET
298# define RWH_WRITE_LIFE_NONE	1
299# define RWH_WRITE_LIFE_SHORT	2
300# define RWH_WRITE_LIFE_MEDIUM	3
301# define RWH_WRITE_LIFE_LONG	4
302# define RWH_WRITE_LIFE_EXTREME	5
303#endif
304
305/* Define some more compatibility macros to be backward compatible with
306   BSD systems which did not managed to hide these kernel macros.  */
307#ifdef	__USE_MISC
308# define FAPPEND	O_APPEND
309# define FFSYNC		O_FSYNC
310# define FASYNC		O_ASYNC
311# define FNONBLOCK	O_NONBLOCK
312# define FNDELAY	O_NDELAY
313#endif /* Use misc.  */
314
315#ifndef __POSIX_FADV_DONTNEED
316#  define __POSIX_FADV_DONTNEED	4
317#  define __POSIX_FADV_NOREUSE	5
318#endif
319/* Advise to `posix_fadvise'.  */
320#ifdef __USE_XOPEN2K
321# define POSIX_FADV_NORMAL	0 /* No further special treatment.  */
322# define POSIX_FADV_RANDOM	1 /* Expect random page references.  */
323# define POSIX_FADV_SEQUENTIAL	2 /* Expect sequential page references.  */
324# define POSIX_FADV_WILLNEED	3 /* Will need these pages.  */
325# define POSIX_FADV_DONTNEED	__POSIX_FADV_DONTNEED /* Don't need these pages.  */
326# define POSIX_FADV_NOREUSE	__POSIX_FADV_NOREUSE /* Data will be accessed once.  */
327#endif
328
329
330#ifdef __USE_GNU
331/* Flags for SYNC_FILE_RANGE.  */
332# define SYNC_FILE_RANGE_WAIT_BEFORE	1 /* Wait upon writeout of all pages
333					     in the range before performing the
334					     write.  */
335# define SYNC_FILE_RANGE_WRITE		2 /* Initiate writeout of all those
336					     dirty pages in the range which are
337					     not presently under writeback.  */
338# define SYNC_FILE_RANGE_WAIT_AFTER	4 /* Wait upon writeout of all pages in
339					     the range after performing the
340					     write.  */
341/* SYNC_FILE_RANGE_WRITE_AND_WAIT ensures all pages in the range are
342   written to disk before returning.  */
343# define SYNC_FILE_RANGE_WRITE_AND_WAIT	(SYNC_FILE_RANGE_WRITE		\
344					 | SYNC_FILE_RANGE_WAIT_BEFORE	\
345					 | SYNC_FILE_RANGE_WAIT_AFTER)
346
347/* Flags for SPLICE and VMSPLICE.  */
348# define SPLICE_F_MOVE		1	/* Move pages instead of copying.  */
349# define SPLICE_F_NONBLOCK	2	/* Don't block on the pipe splicing
350					   (but we may still block on the fd
351					   we splice from/to).  */
352# define SPLICE_F_MORE		4	/* Expect more data.  */
353# define SPLICE_F_GIFT		8	/* Pages passed in are a gift.  */
354
355
356/* Flags for fallocate.  */
357# include <linux/falloc.h>
358
359
360/* File handle structure.  */
361struct file_handle
362{
363  unsigned int handle_bytes;
364  int handle_type;
365  /* File identifier.  */
366  unsigned char f_handle[0];
367};
368
369/* Maximum handle size (for now).  */
370# define MAX_HANDLE_SZ	128
371#endif
372
373#ifdef __USE_GNU
374/* Flags for name_to_handle_at.  See comment in fcntl.h about the use
375   of the same AT_* flag bits for different purposes in different
376   functions.  */
377# define AT_HANDLE_FID		AT_REMOVEDIR /* File handle is needed
378						to compare object
379						identity and may not
380						be usable to
381						open_by_handle_at.  */
382# define AT_HANDLE_MNT_ID_UNIQUE 1 /* Return the 64-bit unique mount
383				      ID.  */
384#endif
385
386__BEGIN_DECLS
387
388#ifdef __USE_GNU
389
390/* Provide kernel hint to read ahead.  */
391extern __ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
392    __THROW;
393
394
395/* Selective file content synch'ing.
396
397   This function is a possible cancellation point and therefore not
398   marked with __THROW.  */
399extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count,
400			    unsigned int __flags);
401
402
403/* Splice address range into a pipe.
404
405   This function is a possible cancellation point and therefore not
406   marked with __THROW.  */
407extern __ssize_t vmsplice (int __fdout, const struct iovec *__iov,
408			   size_t __count, unsigned int __flags);
409
410/* Splice two files together.
411
412   This function is a possible cancellation point and therefore not
413   marked with __THROW.  */
414extern __ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
415			 __off64_t *__offout, size_t __len,
416			 unsigned int __flags);
417
418/* In-kernel implementation of tee for pipe buffers.
419
420   This function is a possible cancellation point and therefore not
421   marked with __THROW.  */
422extern __ssize_t tee (int __fdin, int __fdout, size_t __len,
423		      unsigned int __flags);
424
425/* Reserve storage for the data of the file associated with FD.
426
427   This function is a possible cancellation point and therefore not
428   marked with __THROW.  */
429# ifndef __USE_FILE_OFFSET64
430extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len);
431# else
432#  ifdef __REDIRECT
433extern int __REDIRECT (fallocate, (int __fd, int __mode, __off64_t __offset,
434				   __off64_t __len),
435		       fallocate64);
436#  else
437#   define fallocate fallocate64
438#  endif
439# endif
440# ifdef __USE_LARGEFILE64
441extern int fallocate64 (int __fd, int __mode, __off64_t __offset,
442			__off64_t __len);
443# endif
444
445
446/* Map file name to file handle.  */
447extern int name_to_handle_at (int __dfd, const char *__name,
448			      struct file_handle *__handle, int *__mnt_id,
449			      int __flags) __THROW;
450
451/* Open file using the file handle.
452
453   This function is a possible cancellation point and therefore not
454   marked with __THROW.  */
455extern int open_by_handle_at (int __mountdirfd, struct file_handle *__handle,
456			      int __flags);
457
458#endif	/* use GNU */
459
460__END_DECLS