/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos72Q src/bos/usr/include/fcntl.h 1.39.6.6                            */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 1985,2019              */
/* All Rights Reserved                                                    */
/*                                                                        */
/* US Government Users Restricted Rights - Use, duplication or            */
/* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.      */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
/* @(#)69     1.39.6.6  src/bos/usr/include/fcntl.h, syslfs, bos72Q, q2019_13A4 2/6/19 00:44:34 */
/*
 * COMPONENT_NAME: SYSLFS - Logical File System
 */
#ifndef _H_FCNTL
#define _H_FCNTL

#ifndef _H_STANDARDS
#include <standards.h>
#endif

#include <strict_stdtypes.h>

#ifndef _H_TYPES
#include <sys/types.h>
#endif

#include <end_strict_stdtypes.h>

/*
 * All of the file flags are defined here.  O_ flags and F flags will
 * be defined based on these values.
 */

#define	_FREAD		0x00000001
#define	_FWRITE		0x00000002
#define	_FNONBLOCK	0x00000004
#define	_FAPPEND	0x00000008
#define	_FSYNC		0x00000010
#define	_FEXEC		0x00000020
#define	_FSNAPSHOT	0x00000040
#define	_FCIO		0x00000080
#define	_FCREAT		0x00000100
#define	_FTRUNC		0x00000200
#define	_FEXCL		0x00000400
#define	_FNOCTTY	0x00000800
#define	_FRSHARE	0x00001000
#define	_FDEFER		0x00002000
#define	_FDELAY		0x00004000
#define	_FNDELAY	0x00008000
#define	_FNSHARE	0x00010000
#define	_FASYNC		0x00020000
#define	_FMOUNT		0x00040000
#define	_FSYNCALL	0x00080000
#define	_FNOCACHE	0x00100000
#define	_FREADSYNC	0x00200000
#define	_FDATASYNC	0x00400000
#if (_XOPEN_SOURCE >= 700)
#define _FCLOEXEC       0x00800000
#define _FNOFOLLOW      0x01000000
/* In AIX TTY kernel extension, The terminal parameters are automatically
 * set to default values on first open. Hence _FTTYINIT will be defined as zero.
 */
#define _FTTYINIT       0x0
#endif
#define	_FCLREAD	0x02000000
#define	_FLARGEFILE	0x04000000
#define	_FDIRECT	0x08000000
#define	_FDOCLONE	0x10000000
#define	_FALT		0x20000000
#define	_FKERNEL	0x40000000
#define	_FMSYNC		0x80000000
#if defined(_LONG_LONG) && !defined(__64BIT__)
#define _FRAW		0x0000000100000000LL
#define _FEFSON		0x0000000200000000LL
#define _FEFSOFF	0x0000000400000000LL
#define _FCIOR		0x0000000800000000LL
#define _FDEFERIND      0x0000001000000000LL
#define _FDATAFLUSH     0x0000002000000000LL
#else
#define _FRAW		0x0000000100000000L
#define _FEFSON		0x0000000200000000L
#define _FEFSOFF	0x0000000400000000L
#define _FCIOR		0x0000000800000000L
#define _FDEFERIND      0x0000001000000000L
#define _FDATAFLUSH     0x0000002000000000L
#endif


#define _FMPX		0

/*
 * POSIX requires that certain values be included in fcntl.h and that only
 * these values be present when _POSIX_SOURCE is defined.  This header
 * includes all the POSIX required entries.
 */

#ifdef _POSIX_SOURCE

#ifndef _H_FLOCK
#include <sys/flock.h>     /* for flock structure */
#endif

/* Redefine open and creat for large file enabled programming environment. */

#ifdef __cplusplus
extern "C" {
#endif

#ifdef _LARGE_FILES
#define open	open64
#if (_XOPEN_SOURCE >= 700)
#define openat	open64at
#endif
#define	creat	creat64
#endif

#ifdef _NO_PROTO
extern int open();
#if (_XOPEN_SOURCE >= 700)
extern int openat();
#endif
extern int creat();
extern int fcntl();

#else 		/* use POSIX required prototypes */
#ifndef _KERNEL
extern int open(const char *, int, ...);
#if (_XOPEN_SOURCE >= 700)
extern int openat(int, const char *, int, ...);
#endif
extern int creat(const char *, mode_t);
#ifdef _LARGE_FILE_API
extern int open64(const char *, int, ...);
#if (_XOPEN_SOURCE >= 700)
extern int open64at(int, const char *, int, ...);
#endif
extern int creat64(const char *, mode_t);
#endif
extern int fcntl(int, int,...);
#endif /* _KERNEL */
#endif /* _NO_PROTO */

/* File access modes for open */
#define	O_RDONLY	0
#define	O_WRONLY	1
#define	O_RDWR		2
#define O_EXEC		_FEXEC		/* if file, open for exec	*/
#define O_SEARCH	_FEXEC		/* if directory, check access	*/

/* Mask for use with file access modes */
#if (_XOPEN_SOURCE >= 700)
#define O_ACCMODE	(O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
#else
#define O_ACCMODE	(O_RDONLY | O_WRONLY | O_RDWR)		
#endif

/* File flags accessible to open and fcntl */
#define O_NONBLOCK	_FNONBLOCK	/* POSIX non-blocking I/O	*/
#define	O_APPEND	_FAPPEND  	/* all writes append to the end	*/
 
/* Flag flags accessible only to open */
#define	O_CREAT		_FCREAT		/* open with creation		*/
#define	O_TRUNC		_FTRUNC		/* open with truncation		*/
#define	O_EXCL		_FEXCL		/* exclusive open		*/
#define O_NOCTTY	_FNOCTTY	/* do not assign control tty	*/
#ifdef _LARGE_FILE_API
#define O_LARGEFILE	_FLARGEFILE	/* large file access enabled	*/
#endif 
/* We hijack _FSYNCALL for O_DIRECTORY, since it is not passed to open	*/
#define O_DIRECTORY	_FSYNCALL	/* must be a directory		*/

/* fcntl requests */
#define	 F_DUPFD	0		/* Duplicate file descriptor	*/
#define	 F_GETFD	1		/* Get file descriptor flags	*/
#define	 F_SETFD	2		/* Set file descriptor flags	*/
#define	 F_GETFL	3		/* Get file flags		*/
#define	 F_SETFL	4		/* Set file flags		*/

#if defined(__64BIT_KERNEL) || !(defined(_LARGE_FILES) || defined(__64BIT__))
#define	 F_GETLK	5		/* Get file lock		*/
#define	 F_SETLK	6		/* Set file lock		*/
#define	 F_SETLKW	7		/* Set file lock and wait	*/
#endif

#define  F_GETLK64	11
#define	 F_SETLK64	12
#define	 F_SETLKW64	13
#define	 F_DUP2FD	14		/* Duplicate file descriptor	*/
#define	 F_TSTLK	15		/* Duplicate file descriptor	*/
#define  F_DUPFD_CLOEXEC 16		/* Same as DUPFD, but also set 
					   the close-on-exec flag */


#if !defined(__64BIT_KERNEL) && (defined(_LARGE_FILES) || defined(__64BIT__))
#define	 F_GETLK	F_GETLK64	/* Get file lock	   */
#define	 F_SETLK	F_SETLK64	/* Set file lock	   */
#define	 F_SETLKW	F_SETLKW64	/* Set file lock and wait  */
#endif 

/* File descriptor flags used for fcntl F_GETFD and F_SETFD */
#define FD_CLOEXEC      1		/* Close this file during exec	*/

#if _POSIX_C_SOURCE >= 200112L
extern int posix_fadvise(int,off_t,off_t,int);
#define POSIX_FADV_NORMAL	 1
#define POSIX_FADV_SEQUENTIAL	 2
#define POSIX_FADV_RANDOM	 3
#define POSIX_FADV_WILLNEED	 4
#define POSIX_FADV_DONTNEED	 5
#define POSIX_FADV_NOREUSE	 6

#ifdef _ALL_SOURCE
#define POSIX_FADV_NOWRITEBEHIND 7
#endif /* _ALL_SOURCE */

extern int posix_fallocate(int,off_t,off_t);
#ifdef _LARGE_FILES
#define posix_fadvise posix_fadvise64
#define posix_fallocate posix_fallocate64
#endif /* _LARGE_FILES */
#ifdef _LARGE_FILE_API
extern int posix_fadvise64(int,off64_t,off64_t,int);
extern int posix_fallocate64(int,off64_t,off64_t);
#endif /* _LARGE_FILE_API */
#endif /* _POSIX_C_SOURCE >= 200112L */


#ifdef __cplusplus
}
#endif

#endif /* _POSIX_SOURCE */

#ifdef _XOPEN_SOURCE

#ifndef _H_UNISTD
#include <unistd.h>
#endif

#ifndef _H_STAT
#include <sys/stat.h>
#endif

#define O_SYNC		_FSYNC		/* synchronous write option	*/
#endif /* _XOPEN_SOURCE */

#if _XOPEN_SOURCE_EXTENDED == 1
#define	 F_GETOWN	8		/* Get async I/O owner		*/
#define	 F_SETOWN	9		/* Set async I/O owner		*/
#endif

#if _XOPEN_SOURCE >= 500
#define O_DSYNC		_FDATASYNC	/* sync-write, data only	    */
#define O_RSYNC		_FREADSYNC	/* atime synced before read returns */
#endif

#if _XOPEN_SOURCE >= 700
#define O_CLOEXEC	_FCLOEXEC	/* sets FD_CLOEXEC on open	*/
#define O_NOFOLLOW	_FNOFOLLOW	/* do not follow symlinks	*/
#define O_TTY_INIT	_FTTYINIT	/* sets conforming tty state	*/
#endif /* _XOPEN_SOURCE >= 700 */

/* for ...at() calls (like faccessat, fstatat, linkat, etc) */
#if (_XOPEN_SOURCE >= 700) || defined(_KERNEL)
#define AT_FDCWD		(-2)	/* Use the current working
					 * directory to determine the
					 * beginning of relative file
					 * paths.			*/
#define AT_EACCESS		1	/* Check access using effective
					 * user and group ID.		*/
#define AT_SYMLINK_NOFOLLOW	1	/* Do not follow symbolic links */
#define AT_SYMLINK_FOLLOW	2	/* Follow symbolic links	*/
#define AT_REMOVEDIR		1	/* Remove the directory entry
					 * specified by fd and path as
					 * a directory, not a normal
					 * file.			*/
#endif


#ifdef _ALL_SOURCE


#ifdef __cplusplus
extern "C" {
#endif

#ifdef _NO_PROTO
extern int openx();
#if (_XOPEN_SOURCE >= 700)
extern int openxat();
#endif
#else
#ifndef _KERNEL
#ifndef __64BIT__
extern int openx(char *path, int oflag, ...);
#if (_XOPEN_SOURCE >= 700)
extern int openxat(int, char *path, int oflag, ...);
#endif
#else
extern int openx(char *path, int oflag, mode_t, long);
#if (_XOPEN_SOURCE >= 700)
extern int openxat(int, char *path, int oflag, mode_t, long);
#endif
#endif /* __64BIT__ */
#endif /* !_KERNEL */
#endif /* _NO_PROTO */

/* Additional open modes */

#define	O_NONE		3		/* open without read or write	*/
#define O_RSHARE	_FRSHARE	/* read shared open		*/
#define O_DEFER		_FDEFER		/* defered update		*/
#define O_DELAY		_FDELAY		/* open with delay		*/
#define O_NDELAY	_FNDELAY	/* Non-blocking I/O		*/
#define O_NSHARE	_FNSHARE	/* read shared open		*/
#define O_NOCACHE	_FNOCACHE	/* file data not cached		*/
#define O_DIRECT	_FDIRECT	/* open for direct io		*/
#define O_SNAPSHOT	_FSNAPSHOT	/* open cooked snapshot         */
#define O_CIO   	_FCIO   	/* open for concurrent io	*/
#define O_RAW   	_FRAW   	/* raw mode for encryption 	*/
#define O_EFSON   	_FEFSON   	/* create with encryption 	*/
#define O_EFSOFF   	_FEFSOFF   	/* create without encryption 	*/
#define O_CIOR   	_FCIOR   	/* allow readers with CIO 	*/

#ifdef	_J2_INTERNAL
#define	O_INTSNAP	(_FSNAPSHOT|_FALT)
					/* open cooked internal snapshot*/
#endif	/* _J2_INTERNAL */

/* Additional fcntl requests */

#define  F_CLOSEM	10		/* Close multiple files		*/

/* Additional fcntl F_SETFL flags */

#ifndef _KERNEL
#ifdef	_BSD
/* Provide appropriate definition of FNDELAY for BSD */
#define	FNDELAY		_FNONBLOCK
#undef	O_NDELAY
#define	O_NDELAY	_FNONBLOCK
#else	/* System V */
#define	FNDELAY		_FNDELAY
#endif	/* _BSD */
#endif	/* _KERNEL */

#define	FNONBLOCK 	_FNONBLOCK
#define	FAPPEND		_FAPPEND
#define	FSYNC		_FSYNC
#define FASYNC		_FASYNC
#define FSYNCALL	_FSYNCALL
#define FDIRECTORY	_FSYNCALL	/* see comment at O_DIRECTORY	*/

/* File flag values corresponding to file access modes */

#define	FOPEN		(-1)
#define	FREAD		_FREAD
#define	FWRITE		_FWRITE

#ifdef _KERNEL

#define	FMPX		_FMPX		/* multiplexed open, obsolete	*/

/* FFCNTL is all the bits that may be set via fcntl. */
#define	FFCNTL		(FNONBLOCK|FNDELAY|FAPPEND|FSYNC|FASYNC|FLARGEFILE|\
			FDATASYNC|FREADSYNC|FNOCACHE)

/* open only modes */
#define	FCREAT		_FCREAT
#define	FTRUNC		_FTRUNC
#define	FEXCL		_FEXCL

#define FRSHARE 	_FRSHARE
#define FDEFER		_FDEFER
#define FDELAY		_FDELAY
#define FNDELAY		_FNDELAY
#define FNSHARE		_FNSHARE
#define	FLARGEFILE	_FLARGEFILE
#define FREADSYNC	_FREADSYNC
#define FNOCACHE	_FNOCACHE
#define FDIRECT		_FDIRECT
#define FSNAPSHOT	_FSNAPSHOT
#define FCIO   		_FCIO
#define FRAW   		_FRAW
#define FEFSON 		_FEFSON
#define FEFSOFF 	_FEFSOFF
#define FCIOR	 	_FCIOR

#define	FISNAPSHOT	(_FSNAPSHOT|_FALT)
#define	FREMOUNT	(_FMOUNT|_FALT)

/* additional modes */
#define	FEXEC		_FEXEC		/* open/close for exec		*/
#define	FSEARCH		_FEXEC		/* check perms for dir open	*/
#define	FNOCTTY		_FNOCTTY	/* do not assign control tty	*/
#define	FMOUNT		_FMOUNT		/* open/close for device mounts */
#define	FKERNEL		_FKERNEL	/* caller is in kernel mode	*/
#define FDOCLONE	_FDOCLONE	/* reserve DDOCLONE for devices	*/
#define	FFILESYNC	_FSYNC		/* another name for FSYNC	*/
#define	FDATASYNC	_FDATASYNC	/* fsync data only		*/
#define	FDEFERIND	_FDEFERIND	/* defer indirect on fsync	*/
#define	FDATAFLUSH	_FDATAFLUSH	/* async flush on write		*/
#define	FCLREAD		_FCLREAD	/* clustered read (temporary)	*/
#define FMSYNC		_FMSYNC		/* msync semantics for 		*/
				 	/*     vnop_fsync_range		*/
#define	FNOWRBEHIND	_FCLREAD	/* do not write behind optimize */
#define FALT		_FALT		/* apply alternate flag meaning	*/

#if _XOPEN_SOURCE >= 700
#define FCLOEXEC	_FCLOEXEC	/* sets FD_CLOEXEC on open	*/
#define FNOFOLLOW	_FNOFOLLOW	/* do not follow symlinks	*/
#define FTTYINIT	_FTTYINIT	/* sets conforming tty state	*/
#endif /* _XOPEN_SOURCE >= 700 */

/* FMASK defines the bits that remain in the file flags past the open	*/
#define	FMASK		(FREAD|FWRITE|FNONBLOCK|FAPPEND|FSYNC|FEXEC|FNOCTTY|\
		 FRSHARE|FDEFER|FDELAY|FNDELAY|FNSHARE|FLARGEFILE|FDATASYNC|\
		 FREADSYNC|FNOCACHE|FDIRECT|FCIO|FCIOR|FNOFOLLOW)

#endif	/* _KERNEL	*/

#ifdef __cplusplus
}
#endif

#endif	/* _ALL_SOURCE	*/

#endif	/* _H_FCNTL	*/