1 /* Copyright (C) 1991-2015 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, see 16 <http://www.gnu.org/licenses/>. */ 17 18 /* 19 * POSIX Standard: 6.5 File Control Operations <fcntl.h> 20 */ 21 22 #ifndef _FCNTL_H 23 #define _FCNTL_H 1 24 25 #include <features.h> 26 27 /* This must be early so <bits/fcntl.h> can define types winningly. */ 28 __BEGIN_DECLS 29 30 /* Get __mode_t, __dev_t and __off_t .*/ 31 #include <bits/types.h> 32 33 /* Get the definitions of O_*, F_*, FD_*: all the 34 numbers and flag bits for `open', `fcntl', et al. */ 35 #include <bits/fcntl.h> 36 37 /* Detect if open needs mode as a third argument (or for openat as a fourth 38 argument). */ 39 #ifdef __O_TMPFILE 40 # define __OPEN_NEEDS_MODE(oflag) \ 41 (((oflag) & O_CREAT) != 0 || ((oflag) & __O_TMPFILE) == __O_TMPFILE) 42 #else 43 # define __OPEN_NEEDS_MODE(oflag) (((oflag) & O_CREAT) != 0) 44 #endif 45 46 /* POSIX.1-2001 specifies that these types are defined by <fcntl.h>. 47 Earlier POSIX standards permitted any type ending in `_t' to be defined 48 by any POSIX header, so we don't conditionalize the definitions here. */ 49 #ifndef __mode_t_defined 50 typedef __mode_t mode_t; 51 # define __mode_t_defined 52 #endif 53 54 #ifndef __off_t_defined 55 # ifndef __USE_FILE_OFFSET64 56 typedef __off_t off_t; 57 # else 58 typedef __off64_t off_t; 59 # endif 60 # define __off_t_defined 61 #endif 62 63 #if defined __USE_LARGEFILE64 && !defined __off64_t_defined 64 typedef __off64_t off64_t; 65 # define __off64_t_defined 66 #endif 67 68 #ifndef __pid_t_defined 69 typedef __pid_t pid_t; 70 # define __pid_t_defined 71 #endif 72 73 /* For XPG all symbols from <sys/stat.h> should also be available. */ 74 #if defined __USE_XOPEN || defined __USE_XOPEN2K8 75 # define __need_timespec 76 # include <time.h> 77 # include <bits/stat.h> 78 79 # define S_IFMT __S_IFMT 80 # define S_IFDIR __S_IFDIR 81 # define S_IFCHR __S_IFCHR 82 # define S_IFBLK __S_IFBLK 83 # define S_IFREG __S_IFREG 84 # ifdef __S_IFIFO 85 # define S_IFIFO __S_IFIFO 86 # endif 87 # ifdef __S_IFLNK 88 # define S_IFLNK __S_IFLNK 89 # endif 90 # if (defined __USE_UNIX98 || defined __USE_XOPEN2K8) && defined __S_IFSOCK 91 # define S_IFSOCK __S_IFSOCK 92 # endif 93 94 /* Protection bits. */ 95 96 # define S_ISUID __S_ISUID /* Set user ID on execution. */ 97 # define S_ISGID __S_ISGID /* Set group ID on execution. */ 98 99 # if defined __USE_MISC || defined __USE_XOPEN 100 /* Save swapped text after use (sticky bit). This is pretty well obsolete. */ 101 # define S_ISVTX __S_ISVTX 102 # endif 103 104 # define S_IRUSR __S_IREAD /* Read by owner. */ 105 # define S_IWUSR __S_IWRITE /* Write by owner. */ 106 # define S_IXUSR __S_IEXEC /* Execute by owner. */ 107 /* Read, write, and execute by owner. */ 108 # define S_IRWXU (__S_IREAD|__S_IWRITE|__S_IEXEC) 109 110 # define S_IRGRP (S_IRUSR >> 3) /* Read by group. */ 111 # define S_IWGRP (S_IWUSR >> 3) /* Write by group. */ 112 # define S_IXGRP (S_IXUSR >> 3) /* Execute by group. */ 113 /* Read, write, and execute by group. */ 114 # define S_IRWXG (S_IRWXU >> 3) 115 116 # define S_IROTH (S_IRGRP >> 3) /* Read by others. */ 117 # define S_IWOTH (S_IWGRP >> 3) /* Write by others. */ 118 # define S_IXOTH (S_IXGRP >> 3) /* Execute by others. */ 119 /* Read, write, and execute by others. */ 120 # define S_IRWXO (S_IRWXG >> 3) 121 #endif 122 123 #ifdef __USE_MISC 124 # ifndef R_OK /* Verbatim from <unistd.h>. Ugh. */ 125 /* Values for the second argument to access. 126 These may be OR'd together. */ 127 # define R_OK 4 /* Test for read permission. */ 128 # define W_OK 2 /* Test for write permission. */ 129 # define X_OK 1 /* Test for execute permission. */ 130 # define F_OK 0 /* Test for existence. */ 131 # endif 132 #endif /* Use misc. */ 133 134 /* XPG wants the following symbols. <stdio.h> has the same definitions. */ 135 #if defined __USE_XOPEN || defined __USE_XOPEN2K8 136 # define SEEK_SET 0 /* Seek from beginning of file. */ 137 # define SEEK_CUR 1 /* Seek from current position. */ 138 # define SEEK_END 2 /* Seek from end of file. */ 139 #endif /* XPG */ 140 141 /* The constants AT_REMOVEDIR and AT_EACCESS have the same value. AT_EASSESS 142 is meaningful only to faccessat, while AT_REMOVEDIR is meaningful only to 143 unlinkat. The two functions do completely different things and therefore, 144 the flags can be allowed to overlap. For example, passing AT_REMOVEDIR to 145 faccessat would be undefined behavior and thus treating it equivalent to 146 AT_EACCESS is valid undefined behavior. */ 147 #ifdef __USE_ATFILE 148 # define AT_FDCWD -100 /* Special value used to indicate 149 the *at functions should use the 150 current working directory. */ 151 # define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */ 152 # define AT_REMOVEDIR 0x200 /* Remove directory instead of 153 unlinking file. */ 154 # define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ 155 # ifdef __USE_GNU 156 # define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount 157 traversal. */ 158 # define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname. */ 159 # endif 160 # define AT_EACCESS 0x200 /* Test access permitted for 161 effective IDs, not real IDs. */ 162 #endif 163 164 /* Do the file control operation described by CMD on FD. 165 The remaining arguments are interpreted depending on CMD. 166 167 This function is a cancellation point and therefore not marked with 168 __THROW. */ 169 extern int fcntl (int __fd, int __cmd, ...); 170 171 /* Open FILE and return a new file descriptor for it, or -1 on error. 172 OFLAG determines the type of access used. If O_CREAT or O_TMPFILE is set 173 in OFLAG, the third argument is taken as a `mode_t', the mode of the 174 created file. 175 176 This function is a cancellation point and therefore not marked with 177 __THROW. */ 178 #ifndef __USE_FILE_OFFSET64 179 extern int open (const char *__file, int __oflag, ...) __nonnull ((1)); 180 #else 181 # ifdef __REDIRECT 182 extern int __REDIRECT (open, (const char *__file, int __oflag, ...), open64) 183 __nonnull ((1)); 184 # else 185 # define open open64 186 # endif 187 #endif 188 #ifdef __USE_LARGEFILE64 189 extern int open64 (const char *__file, int __oflag, ...) __nonnull ((1)); 190 #endif 191 192 #ifdef __USE_ATFILE 193 /* Similar to `open' but a relative path name is interpreted relative to 194 the directory for which FD is a descriptor. 195 196 NOTE: some other `openat' implementation support additional functionality 197 through this interface, especially using the O_XATTR flag. This is not 198 yet supported here. 199 200 This function is a cancellation point and therefore not marked with 201 __THROW. */ 202 # ifndef __USE_FILE_OFFSET64 203 extern int openat (int __fd, const char *__file, int __oflag, ...) 204 __nonnull ((2)); 205 # else 206 # ifdef __REDIRECT 207 extern int __REDIRECT (openat, (int __fd, const char *__file, int __oflag, 208 ...), openat64) __nonnull ((2)); 209 # else 210 # define openat openat64 211 # endif 212 # endif 213 # ifdef __USE_LARGEFILE64 214 extern int openat64 (int __fd, const char *__file, int __oflag, ...) 215 __nonnull ((2)); 216 # endif 217 #endif 218 219 /* Create and open FILE, with mode MODE. This takes an `int' MODE 220 argument because that is what `mode_t' will be widened to. 221 222 This function is a cancellation point and therefore not marked with 223 __THROW. */ 224 #ifndef __USE_FILE_OFFSET64 225 extern int creat (const char *__file, mode_t __mode) __nonnull ((1)); 226 #else 227 # ifdef __REDIRECT 228 extern int __REDIRECT (creat, (const char *__file, mode_t __mode), 229 creat64) __nonnull ((1)); 230 # else 231 # define creat creat64 232 # endif 233 #endif 234 #ifdef __USE_LARGEFILE64 235 extern int creat64 (const char *__file, mode_t __mode) __nonnull ((1)); 236 #endif 237 238 #if !defined F_LOCK && (defined __USE_MISC || (defined __USE_XOPEN_EXTENDED \ 239 && !defined __USE_POSIX)) 240 /* NOTE: These declarations also appear in <unistd.h>; be sure to keep both 241 files consistent. Some systems have them there and some here, and some 242 software depends on the macros being defined without including both. */ 243 244 /* `lockf' is a simpler interface to the locking facilities of `fcntl'. 245 LEN is always relative to the current file position. 246 The CMD argument is one of the following. */ 247 248 # define F_ULOCK 0 /* Unlock a previously locked region. */ 249 # define F_LOCK 1 /* Lock a region for exclusive use. */ 250 # define F_TLOCK 2 /* Test and lock a region for exclusive use. */ 251 # define F_TEST 3 /* Test a region for other processes locks. */ 252 253 # ifndef __USE_FILE_OFFSET64 254 extern int lockf (int __fd, int __cmd, off_t __len); 255 # else 256 # ifdef __REDIRECT 257 extern int __REDIRECT (lockf, (int __fd, int __cmd, __off64_t __len), lockf64); 258 # else 259 # define lockf lockf64 260 # endif 261 # endif 262 # ifdef __USE_LARGEFILE64 263 extern int lockf64 (int __fd, int __cmd, off64_t __len); 264 # endif 265 #endif 266 267 #ifdef __USE_XOPEN2K 268 /* Advice the system about the expected behaviour of the application with 269 respect to the file associated with FD. */ 270 # ifndef __USE_FILE_OFFSET64 271 extern int posix_fadvise (int __fd, off_t __offset, off_t __len, 272 int __advise) __THROW; 273 # else 274 # ifdef __REDIRECT_NTH 275 extern int __REDIRECT_NTH (posix_fadvise, (int __fd, __off64_t __offset, 276 __off64_t __len, int __advise), 277 posix_fadvise64); 278 # else 279 # define posix_fadvise posix_fadvise64 280 # endif 281 # endif 282 # ifdef __USE_LARGEFILE64 283 extern int posix_fadvise64 (int __fd, off64_t __offset, off64_t __len, 284 int __advise) __THROW; 285 # endif 286 287 288 /* Reserve storage for the data of the file associated with FD. 289 290 This function is a possible cancellation point and therefore not 291 marked with __THROW. */ 292 # ifndef __USE_FILE_OFFSET64 293 extern int posix_fallocate (int __fd, off_t __offset, off_t __len); 294 # else 295 # ifdef __REDIRECT 296 extern int __REDIRECT (posix_fallocate, (int __fd, __off64_t __offset, 297 __off64_t __len), 298 posix_fallocate64); 299 # else 300 # define posix_fallocate posix_fallocate64 301 # endif 302 # endif 303 # ifdef __USE_LARGEFILE64 304 extern int posix_fallocate64 (int __fd, off64_t __offset, off64_t __len); 305 # endif 306 #endif 307 308 309 /* Define some inlines helping to catch common problems. */ 310 #if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function \ 311 && defined __va_arg_pack_len 312 # include <bits/fcntl2.h> 313 #endif 314 315 __END_DECLS 316 317 #endif /* fcntl.h */ 318