1 /* Like <fcntl.h>, but with non-working flags defined to 0. 2 3 Copyright (C) 2006-2020 Free Software Foundation, Inc. 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program 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 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 17 18 /* written by Paul Eggert */ 19 20 #if __GNUC__ >= 3 21 @PRAGMA_SYSTEM_HEADER@ 22 #endif 23 @PRAGMA_COLUMNS@ 24 25 #if defined __need_system_fcntl_h 26 /* Special invocation convention. */ 27 28 /* Needed before <sys/stat.h>. 29 May also define off_t to a 64-bit type on native Windows. */ 30 #include <sys/types.h> 31 /* On some systems other than glibc, <sys/stat.h> is a prerequisite of 32 <fcntl.h>. On glibc systems, we would like to avoid namespace pollution. 33 But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an 34 extern "C" { ... } block, which leads to errors in C++ mode with the 35 overridden <sys/stat.h> from gnulib. These errors are known to be gone 36 with g++ version >= 4.3. */ 37 #if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))) 38 # include <sys/stat.h> 39 #endif 40 #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ 41 42 /* Native Windows platforms declare open(), creat() in <io.h>. */ 43 #if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \ 44 && (defined _WIN32 && ! defined __CYGWIN__) 45 # include <io.h> 46 #endif 47 48 #else 49 /* Normal invocation convention. */ 50 51 #ifndef _@GUARD_PREFIX@_FCNTL_H 52 53 /* Needed before <sys/stat.h>. 54 May also define off_t to a 64-bit type on native Windows. */ 55 #include <sys/types.h> 56 /* On some systems other than glibc, <sys/stat.h> is a prerequisite of 57 <fcntl.h>. On glibc systems, we would like to avoid namespace pollution. 58 But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an 59 extern "C" { ... } block, which leads to errors in C++ mode with the 60 overridden <sys/stat.h> from gnulib. These errors are known to be gone 61 with g++ version >= 4.3. */ 62 #if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))) 63 # include <sys/stat.h> 64 #endif 65 /* The include_next requires a split double-inclusion guard. */ 66 #@INCLUDE_NEXT@ @NEXT_FCNTL_H@ 67 68 /* Native Windows platforms declare open(), creat() in <io.h>. */ 69 #if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \ 70 && (defined _WIN32 && ! defined __CYGWIN__) 71 # include <io.h> 72 #endif 73 74 #ifndef _@GUARD_PREFIX@_FCNTL_H 75 #define _@GUARD_PREFIX@_FCNTL_H 76 77 #ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */ 78 # include <unistd.h> 79 #endif 80 81 82 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ 83 84 /* The definition of _GL_ARG_NONNULL is copied here. */ 85 86 /* The definition of _GL_WARN_ON_USE is copied here. */ 87 88 89 /* Declare overridden functions. */ 90 91 #if @GNULIB_CREAT@ 92 # if @REPLACE_CREAT@ 93 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 94 # undef creat 95 # define creat rpl_creat 96 # endif 97 _GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode) 98 _GL_ARG_NONNULL ((1))); 99 _GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode)); 100 # else 101 _GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode)); 102 # endif 103 _GL_CXXALIASWARN (creat); 104 #elif defined GNULIB_POSIXCHECK 105 # undef creat 106 /* Assume creat is always declared. */ 107 _GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - " 108 "use gnulib module creat for portability"); 109 #endif 110 111 #if @GNULIB_FCNTL@ 112 # if @REPLACE_FCNTL@ 113 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 114 # undef fcntl 115 # define fcntl rpl_fcntl 116 # endif 117 _GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...)); 118 _GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...)); 119 # if !GNULIB_defined_rpl_fcntl 120 # define GNULIB_defined_rpl_fcntl 1 121 # endif 122 # else 123 # if !@HAVE_FCNTL@ 124 _GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...)); 125 # if !GNULIB_defined_fcntl 126 # define GNULIB_defined_fcntl 1 127 # endif 128 # endif 129 _GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...)); 130 # endif 131 _GL_CXXALIASWARN (fcntl); 132 #elif defined GNULIB_POSIXCHECK 133 # undef fcntl 134 # if HAVE_RAW_DECL_FCNTL 135 _GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - " 136 "use gnulib module fcntl for portability"); 137 # endif 138 #endif 139 140 #if @GNULIB_OPEN@ 141 # if @REPLACE_OPEN@ 142 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 143 # undef open 144 # define open rpl_open 145 # endif 146 _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) 147 _GL_ARG_NONNULL ((1))); 148 _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); 149 # else 150 _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); 151 # endif 152 /* On HP-UX 11, in C++ mode, open() is defined as an inline function with a 153 default argument. _GL_CXXALIASWARN does not work in this case. */ 154 # if !defined __hpux 155 _GL_CXXALIASWARN (open); 156 # endif 157 #elif defined GNULIB_POSIXCHECK 158 # undef open 159 /* Assume open is always declared. */ 160 _GL_WARN_ON_USE (open, "open is not always POSIX compliant - " 161 "use gnulib module open for portability"); 162 #endif 163 164 #if @GNULIB_OPENAT@ 165 # if @REPLACE_OPENAT@ 166 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 167 # undef openat 168 # define openat rpl_openat 169 # endif 170 _GL_FUNCDECL_RPL (openat, int, 171 (int fd, char const *file, int flags, /* mode_t mode */ ...) 172 _GL_ARG_NONNULL ((2))); 173 _GL_CXXALIAS_RPL (openat, int, 174 (int fd, char const *file, int flags, /* mode_t mode */ ...)); 175 # else 176 # if !@HAVE_OPENAT@ 177 _GL_FUNCDECL_SYS (openat, int, 178 (int fd, char const *file, int flags, /* mode_t mode */ ...) 179 _GL_ARG_NONNULL ((2))); 180 # endif 181 _GL_CXXALIAS_SYS (openat, int, 182 (int fd, char const *file, int flags, /* mode_t mode */ ...)); 183 # endif 184 _GL_CXXALIASWARN (openat); 185 #elif defined GNULIB_POSIXCHECK 186 # undef openat 187 # if HAVE_RAW_DECL_OPENAT 188 _GL_WARN_ON_USE (openat, "openat is not portable - " 189 "use gnulib module openat for portability"); 190 # endif 191 #endif 192 193 194 /* Fix up the FD_* macros, only known to be missing on mingw. */ 195 196 #ifndef FD_CLOEXEC 197 # define FD_CLOEXEC 1 198 #endif 199 200 /* Fix up the supported F_* macros. Intentionally leave other F_* 201 macros undefined. Only known to be missing on mingw. */ 202 203 #ifndef F_DUPFD_CLOEXEC 204 # define F_DUPFD_CLOEXEC 0x40000000 205 /* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */ 206 # define GNULIB_defined_F_DUPFD_CLOEXEC 1 207 #else 208 # define GNULIB_defined_F_DUPFD_CLOEXEC 0 209 #endif 210 211 #ifndef F_DUPFD 212 # define F_DUPFD 1 213 #endif 214 215 #ifndef F_GETFD 216 # define F_GETFD 2 217 #endif 218 219 /* Fix up the O_* macros. */ 220 221 /* AIX 7.1 with XL C 12.1 defines O_CLOEXEC, O_NOFOLLOW, and O_TTY_INIT 222 to values outside 'int' range, so omit these misdefinitions. 223 But avoid namespace pollution on non-AIX systems. */ 224 #ifdef _AIX 225 # include <limits.h> 226 # if defined O_CLOEXEC && ! (INT_MIN <= O_CLOEXEC && O_CLOEXEC <= INT_MAX) 227 # undef O_CLOEXEC 228 # endif 229 # if defined O_NOFOLLOW && ! (INT_MIN <= O_NOFOLLOW && O_NOFOLLOW <= INT_MAX) 230 # undef O_NOFOLLOW 231 # endif 232 # if defined O_TTY_INIT && ! (INT_MIN <= O_TTY_INIT && O_TTY_INIT <= INT_MAX) 233 # undef O_TTY_INIT 234 # endif 235 #endif 236 237 #if !defined O_DIRECT && defined O_DIRECTIO 238 /* Tru64 spells it 'O_DIRECTIO'. */ 239 # define O_DIRECT O_DIRECTIO 240 #endif 241 242 #if !defined O_CLOEXEC && defined O_NOINHERIT 243 /* Mingw spells it 'O_NOINHERIT'. */ 244 # define O_CLOEXEC O_NOINHERIT 245 #endif 246 247 #ifndef O_CLOEXEC 248 # define O_CLOEXEC 0x40000000 /* Try to not collide with system O_* flags. */ 249 # define GNULIB_defined_O_CLOEXEC 1 250 #else 251 # define GNULIB_defined_O_CLOEXEC 0 252 #endif 253 254 #ifndef O_DIRECT 255 # define O_DIRECT 0 256 #endif 257 258 #ifndef O_DIRECTORY 259 # define O_DIRECTORY 0 260 #endif 261 262 #ifndef O_DSYNC 263 # define O_DSYNC 0 264 #endif 265 266 #ifndef O_EXEC 267 # define O_EXEC O_RDONLY /* This is often close enough in older systems. */ 268 #endif 269 270 #ifndef O_IGNORE_CTTY 271 # define O_IGNORE_CTTY 0 272 #endif 273 274 #ifndef O_NDELAY 275 # define O_NDELAY 0 276 #endif 277 278 #ifndef O_NOATIME 279 # define O_NOATIME 0 280 #endif 281 282 #ifndef O_NONBLOCK 283 # define O_NONBLOCK O_NDELAY 284 #endif 285 286 /* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero 287 value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY 288 or to 0 as fallback. */ 289 #if @GNULIB_NONBLOCKING@ 290 # if O_NONBLOCK 291 # define GNULIB_defined_O_NONBLOCK 0 292 # else 293 # define GNULIB_defined_O_NONBLOCK 1 294 # undef O_NONBLOCK 295 # define O_NONBLOCK 0x40000000 296 # endif 297 #endif 298 299 #ifndef O_NOCTTY 300 # define O_NOCTTY 0 301 #endif 302 303 #ifndef O_NOFOLLOW 304 # define O_NOFOLLOW 0 305 #endif 306 307 #ifndef O_NOLINK 308 # define O_NOLINK 0 309 #endif 310 311 #ifndef O_NOLINKS 312 # define O_NOLINKS 0 313 #endif 314 315 #ifndef O_NOTRANS 316 # define O_NOTRANS 0 317 #endif 318 319 #ifndef O_RSYNC 320 # define O_RSYNC 0 321 #endif 322 323 #ifndef O_SEARCH 324 # define O_SEARCH O_RDONLY /* This is often close enough in older systems. */ 325 #endif 326 327 #ifndef O_SYNC 328 # define O_SYNC 0 329 #endif 330 331 #ifndef O_TTY_INIT 332 # define O_TTY_INIT 0 333 #endif 334 335 #if ~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) 336 # undef O_ACCMODE 337 # define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) 338 #endif 339 340 /* For systems that distinguish between text and binary I/O. 341 O_BINARY is usually declared in fcntl.h */ 342 #if !defined O_BINARY && defined _O_BINARY 343 /* For MSC-compatible compilers. */ 344 # define O_BINARY _O_BINARY 345 # define O_TEXT _O_TEXT 346 #endif 347 348 #if defined __BEOS__ || defined __HAIKU__ 349 /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */ 350 # undef O_BINARY 351 # undef O_TEXT 352 #endif 353 354 #ifndef O_BINARY 355 # define O_BINARY 0 356 # define O_TEXT 0 357 #endif 358 359 /* Fix up the AT_* macros. */ 360 361 /* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its 362 value exceeds INT_MAX, so its use as an int doesn't conform to the 363 C standard, and GCC and Sun C complain in some cases. If the bug 364 is present, undef AT_FDCWD here, so it can be redefined below. */ 365 #if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553 366 # undef AT_FDCWD 367 #endif 368 369 /* Use the same bit pattern as Solaris 9, but with the proper 370 signedness. The bit pattern is important, in case this actually is 371 Solaris with the above workaround. */ 372 #ifndef AT_FDCWD 373 # define AT_FDCWD (-3041965) 374 #endif 375 376 /* Use the same values as Solaris 9. This shouldn't matter, but 377 there's no real reason to differ. */ 378 #ifndef AT_SYMLINK_NOFOLLOW 379 # define AT_SYMLINK_NOFOLLOW 4096 380 #endif 381 382 #ifndef AT_REMOVEDIR 383 # define AT_REMOVEDIR 1 384 #endif 385 386 /* Solaris 9 lacks these two, so just pick unique values. */ 387 #ifndef AT_SYMLINK_FOLLOW 388 # define AT_SYMLINK_FOLLOW 2 389 #endif 390 391 #ifndef AT_EACCESS 392 # define AT_EACCESS 4 393 #endif 394 395 396 #endif /* _@GUARD_PREFIX@_FCNTL_H */ 397 #endif /* _@GUARD_PREFIX@_FCNTL_H */ 398 #endif 399