1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  27 /*        All Rights Reserved   */
  28 
  29 /*
  30  * University Copyright- Copyright (c) 1982, 1986, 1988
  31  * The Regents of the University of California
  32  * All Rights Reserved
  33  *
  34  * University Acknowledgment- Portions of this document are derived from
  35  * software developed by the University of California, Berkeley, and its
  36  * contributors.
  37  */
  38 
  39 #ifndef _SYS_FCNTL_H
  40 #define _SYS_FCNTL_H
  41 
  42 #include <sys/feature_tests.h>
  43 
  44 #include <sys/types.h>
  45 
  46 #ifdef  __cplusplus
  47 extern "C" {
  48 #endif
  49 
  50 /*
  51  * Flag values accessible to open(2) and fcntl(2)
  52  * The first five can only be set (exclusively) by open(2).
  53  */
  54 #define O_RDONLY        0
  55 #define O_WRONLY        1
  56 #define O_RDWR          2
  57 #define O_SEARCH        0x200000
  58 #define O_EXEC          0x400000
  59 #if defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE)
  60 #define O_NDELAY        0x04    /* non-blocking I/O */
  61 #endif /* defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) */
  62 #define O_APPEND        0x08    /* append (writes guaranteed at the end) */
  63 #if defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) || \
  64         (_POSIX_C_SOURCE > 2) || defined(_XOPEN_SOURCE)
  65 #define O_SYNC          0x10    /* synchronized file update option */
  66 #define O_DSYNC         0x40    /* synchronized data update option */
  67 #define O_RSYNC         0x8000  /* synchronized file update option */
  68                                 /* defines read/write file integrity */
  69 #endif /* defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) ... */
  70 #define O_NONBLOCK      0x80    /* non-blocking I/O (POSIX) */
  71 #ifdef  _LARGEFILE_SOURCE
  72 #define O_LARGEFILE     0x2000
  73 #endif
  74 
  75 /*
  76  * Flag values accessible only to open(2).
  77  */
  78 #define O_CREAT         0x100   /* open with file create (uses third arg) */
  79 #define O_TRUNC         0x200   /* open with truncation */
  80 #define O_EXCL          0x400   /* exclusive open */
  81 #define O_NOCTTY        0x800   /* don't allocate controlling tty (POSIX) */
  82 #define O_XATTR         0x4000  /* extended attribute */
  83 #define O_NOFOLLOW      0x20000 /* don't follow symlinks */
  84 #define O_NOLINKS       0x40000 /* don't allow multiple hard links */
  85 
  86 /*
  87  * fcntl(2) requests
  88  *
  89  * N.B.: values are not necessarily assigned sequentially below.
  90  */
  91 #define F_DUPFD         0       /* Duplicate fildes */
  92 #define F_GETFD         1       /* Get fildes flags */
  93 #define F_SETFD         2       /* Set fildes flags */
  94 #define F_GETFL         3       /* Get file flags */
  95 #define F_GETXFL        45      /* Get file flags including open-only flags */
  96 #define F_SETFL         4       /* Set file flags */
  97 
  98 /*
  99  * Applications that read /dev/mem must be built like the kernel.  A
 100  * new symbol "_KMEMUSER" is defined for this purpose.
 101  */
 102 #if defined(_KERNEL) || defined(_KMEMUSER)
 103 #define F_O_GETLK       5       /* SVR3 Get file lock (need for rfs, across */
 104                                 /* the wire compatibility */
 105 /* clustering: lock id contains both per-node sysid and node id */
 106 #define SYSIDMASK               0x0000ffff
 107 #define GETSYSID(id)            (id & SYSIDMASK)
 108 #define NODEIDMASK              0xffff0000
 109 #define BITS_IN_SYSID           16
 110 #define GETNLMID(sysid)         ((int)(((uint_t)(sysid) & NODEIDMASK) >> \
 111                                     BITS_IN_SYSID))
 112 
 113 /* Clustering: Macro used for PXFS locks */
 114 #define GETPXFSID(sysid)        ((int)(((uint_t)(sysid) & NODEIDMASK) >> \
 115                                     BITS_IN_SYSID))
 116 #endif  /* defined(_KERNEL) */
 117 
 118 #define F_CHKFL         8       /* Unused */
 119 #define F_DUP2FD        9       /* Duplicate fildes at third arg */
 120 
 121 #define F_ISSTREAM      13      /* Is the file desc. a stream ? */
 122 #define F_PRIV          15      /* Turn on private access to file */
 123 #define F_NPRIV         16      /* Turn off private access to file */
 124 #define F_QUOTACTL      17      /* UFS quota call */
 125 #define F_BLOCKS        18      /* Get number of BLKSIZE blocks allocated */
 126 #define F_BLKSIZE       19      /* Get optimal I/O block size */
 127 /*
 128  * Numbers 20-22 have been removed and should not be reused.
 129  */
 130 #define F_GETOWN        23      /* Get owner (socket emulation) */
 131 #define F_SETOWN        24      /* Set owner (socket emulation) */
 132 #define F_REVOKE        25      /* Object reuse revoke access to file desc. */
 133 
 134 #define F_HASREMOTELOCKS 26     /* Does vp have NFS locks; private to lock */
 135                                 /* manager */
 136 
 137 /*
 138  * Commands that refer to flock structures.  The argument types differ between
 139  * the large and small file environments; therefore, the #defined values must
 140  * as well.
 141  * The NBMAND forms are private and should not be used.
 142  */
 143 
 144 #if defined(_LP64) || _FILE_OFFSET_BITS == 32
 145 /* "Native" application compilation environment */
 146 #define F_SETLK         6       /* Set file lock */
 147 #define F_SETLKW        7       /* Set file lock and wait */
 148 #define F_ALLOCSP       10      /* Allocate file space */
 149 #define F_FREESP        11      /* Free file space */
 150 #define F_GETLK         14      /* Get file lock */
 151 #define F_SETLK_NBMAND  42      /* private */
 152 #else
 153 /* ILP32 large file application compilation environment version */
 154 #define F_SETLK         34      /* Set file lock */
 155 #define F_SETLKW        35      /* Set file lock and wait */
 156 #define F_ALLOCSP       28      /* Alllocate file space */
 157 #define F_FREESP        27      /* Free file space */
 158 #define F_GETLK         33      /* Get file lock */
 159 #define F_SETLK_NBMAND  44      /* private */
 160 #endif /* _LP64 || _FILE_OFFSET_BITS == 32 */
 161 
 162 #if     defined(_LARGEFILE64_SOURCE)
 163 
 164 #if !defined(_LP64) || defined(_KERNEL)
 165 /*
 166  * transitional large file interface version
 167  * These are only valid in a 32 bit application compiled with large files
 168  * option, for source compatibility, the 64-bit versions are mapped back
 169  * to the native versions.
 170  */
 171 #define F_SETLK64       34      /* Set file lock */
 172 #define F_SETLKW64      35      /* Set file lock and wait */
 173 #define F_ALLOCSP64     28      /* Allocate file space */
 174 #define F_FREESP64      27      /* Free file space */
 175 #define F_GETLK64       33      /* Get file lock */
 176 #define F_SETLK64_NBMAND        44      /* private */
 177 #else
 178 #define F_SETLK64       6       /* Set file lock */
 179 #define F_SETLKW64      7       /* Set file lock and wait */
 180 #define F_ALLOCSP64     10      /* Allocate file space */
 181 #define F_FREESP64      11      /* Free file space */
 182 #define F_GETLK64       14      /* Get file lock */
 183 #define F_SETLK64_NBMAND        42      /* private */
 184 #endif /* !_LP64 || _KERNEL */
 185 
 186 #endif /* _LARGEFILE64_SOURCE */
 187 
 188 #define F_SHARE         40      /* Set a file share reservation */
 189 #define F_UNSHARE       41      /* Remove a file share reservation */
 190 #define F_SHARE_NBMAND  43      /* private */
 191 
 192 #define F_BADFD         46      /* Create Poison FD */
 193 
 194 /*
 195  * File segment locking set data type - information passed to system by user.
 196  */
 197 
 198 /* regular version, for both small and large file compilation environment */
 199 typedef struct flock {
 200         short   l_type;
 201         short   l_whence;
 202         off_t   l_start;
 203         off_t   l_len;          /* len == 0 means until end of file */
 204         int     l_sysid;
 205         pid_t   l_pid;
 206         long    l_pad[4];               /* reserve area */
 207 } flock_t;
 208 
 209 #if defined(_SYSCALL32)
 210 
 211 /* Kernel's view of ILP32 flock structure */
 212 
 213 typedef struct flock32 {
 214         int16_t l_type;
 215         int16_t l_whence;
 216         off32_t l_start;
 217         off32_t l_len;          /* len == 0 means until end of file */
 218         int32_t l_sysid;
 219         pid32_t l_pid;
 220         int32_t l_pad[4];               /* reserve area */
 221 } flock32_t;
 222 
 223 #endif /* _SYSCALL32 */
 224 
 225 /* transitional large file interface version */
 226 
 227 #if     defined(_LARGEFILE64_SOURCE)
 228 
 229 typedef struct flock64 {
 230         short   l_type;
 231         short   l_whence;
 232         off64_t l_start;
 233         off64_t l_len;          /* len == 0 means until end of file */
 234         int     l_sysid;
 235         pid_t   l_pid;
 236         long    l_pad[4];               /* reserve area */
 237 } flock64_t;
 238 
 239 #if defined(_SYSCALL32)
 240 
 241 /* Kernel's view of ILP32 flock64 */
 242 
 243 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
 244 #pragma pack(4)
 245 #endif
 246 
 247 typedef struct flock64_32 {
 248         int16_t l_type;
 249         int16_t l_whence;
 250         off64_t l_start;
 251         off64_t l_len;          /* len == 0 means until end of file */
 252         int32_t l_sysid;
 253         pid32_t l_pid;
 254         int32_t l_pad[4];               /* reserve area */
 255 } flock64_32_t;
 256 
 257 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
 258 #pragma pack()
 259 #endif
 260 
 261 /* Kernel's view of LP64 flock64 */
 262 
 263 typedef struct flock64_64 {
 264         int16_t l_type;
 265         int16_t l_whence;
 266         off64_t l_start;
 267         off64_t l_len;          /* len == 0 means until end of file */
 268         int32_t l_sysid;
 269         pid32_t l_pid;
 270         int64_t l_pad[4];               /* reserve area */
 271 } flock64_64_t;
 272 
 273 #endif  /* _SYSCALL32 */
 274 
 275 #endif /* _LARGEFILE64_SOURCE */
 276 
 277 #if defined(_KERNEL) || defined(_KMEMUSER)
 278 /* SVr3 flock type; needed for rfs across the wire compatibility */
 279 typedef struct o_flock {
 280         int16_t l_type;
 281         int16_t l_whence;
 282         int32_t l_start;
 283         int32_t l_len;          /* len == 0 means until end of file */
 284         int16_t l_sysid;
 285         int16_t l_pid;
 286 } o_flock_t;
 287 #endif  /* defined(_KERNEL) */
 288 
 289 /*
 290  * File segment locking types.
 291  */
 292 #define F_RDLCK         01      /* Read lock */
 293 #define F_WRLCK         02      /* Write lock */
 294 #define F_UNLCK         03      /* Remove lock(s) */
 295 #define F_UNLKSYS       04      /* remove remote locks for a given system */
 296 
 297 /*
 298  * POSIX constants
 299  */
 300 
 301 /* Mask for file access modes */
 302 #define O_ACCMODE       (O_SEARCH | O_EXEC | 0x3)
 303 #define FD_CLOEXEC      1       /* close on exec flag */
 304 
 305 /*
 306  * DIRECTIO
 307  */
 308 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
 309 #define DIRECTIO_OFF    (0)
 310 #define DIRECTIO_ON     (1)
 311 
 312 /*
 313  * File share reservation type
 314  */
 315 typedef struct fshare {
 316         short   f_access;
 317         short   f_deny;
 318         int     f_id;
 319 } fshare_t;
 320 
 321 /*
 322  * f_access values
 323  */
 324 #define F_RDACC         0x1     /* Read-only share access */
 325 #define F_WRACC         0x2     /* Write-only share access */
 326 #define F_RWACC         0x3     /* Read-Write share access */
 327 #define F_RMACC         0x4     /* private flag: Delete share access */
 328 #define F_MDACC         0x20    /* private flag: Metadata share access */
 329 
 330 /*
 331  * f_deny values
 332  */
 333 #define F_NODNY         0x0     /* Don't deny others access */
 334 #define F_RDDNY         0x1     /* Deny others read share access */
 335 #define F_WRDNY         0x2     /* Deny others write share access */
 336 #define F_RWDNY         0x3     /* Deny others read or write share access */
 337 #define F_RMDNY         0x4     /* private flag: Deny delete share access */
 338 #define F_COMPAT        0x8     /* Set share to old DOS compatibility mode */
 339 #define F_MANDDNY       0x10    /* private flag: mandatory enforcement */
 340 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */
 341 
 342 /*
 343  * Special flags for functions such as openat(), fstatat()....
 344  */
 345 #if !defined(__XOPEN_OR_POSIX) || defined(_ATFILE_SOURCE) || \
 346         defined(__EXTENSIONS__)
 347         /* || defined(_XPG7) */
 348 #define AT_FDCWD                        0xffd19553
 349 #define AT_SYMLINK_NOFOLLOW             0x1000
 350 #define AT_SYMLINK_FOLLOW               0x2000  /* only for linkat() */
 351 #define AT_REMOVEDIR                    0x1
 352 #define _AT_TRIGGER                     0x2
 353 #define AT_EACCESS                      0x4     /* use EUID/EGID for access */
 354 #endif
 355 
 356 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG6) || defined(__EXTENSIONS__)
 357 /* advice for posix_fadvise */
 358 #define POSIX_FADV_NORMAL       0
 359 #define POSIX_FADV_RANDOM       1
 360 #define POSIX_FADV_SEQUENTIAL   2
 361 #define POSIX_FADV_WILLNEED     3
 362 #define POSIX_FADV_DONTNEED     4
 363 #define POSIX_FADV_NOREUSE      5
 364 #endif
 365 
 366 #ifdef  __cplusplus
 367 }
 368 #endif
 369 
 370 #endif  /* _SYS_FCNTL_H */