1 /* Like <fcntl.h>, but with non-working flags defined to 0. 2 3 Copyright (C) 2006-2021 Free Software Foundation, Inc. 4 5 This file is free software: you can redistribute it and/or modify 6 it under the terms of the GNU Lesser General Public License as 7 published by the Free Software Foundation; either version 2.1 of the 8 License, or (at your option) any later version. 9 10 This file 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 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser 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 # elif defined _WIN32 && !defined __CYGWIN__ 101 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 102 # undef creat 103 # define creat _creat 104 # endif 105 _GL_CXXALIAS_MDA (creat, int, (const char *filename, mode_t mode)); 106 # else 107 _GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode)); 108 # endif 109 _GL_CXXALIASWARN (creat); 110 #elif defined GNULIB_POSIXCHECK 111 # undef creat 112 /* Assume creat is always declared. */ 113 _GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - " 114 "use gnulib module creat for portability"); 115 #elif @GNULIB_MDA_CREAT@ 116 /* On native Windows, map 'creat' to '_creat', so that -loldnames is not 117 required. In C++ with GNULIB_NAMESPACE, avoid differences between 118 platforms by defining GNULIB_NAMESPACE::creat always. */ 119 # if defined _WIN32 && !defined __CYGWIN__ 120 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 121 # undef creat 122 # define creat _creat 123 # endif 124 /* Need to cast, because in mingw the last argument is 'int mode'. */ 125 _GL_CXXALIAS_MDA_CAST (creat, int, (const char *filename, mode_t mode)); 126 # else 127 _GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode)); 128 # endif 129 _GL_CXXALIASWARN (creat); 130 #endif 131 132 #if @GNULIB_FCNTL@ 133 # if @REPLACE_FCNTL@ 134 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 135 # undef fcntl 136 # define fcntl rpl_fcntl 137 # endif 138 _GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...)); 139 _GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...)); 140 # if !GNULIB_defined_rpl_fcntl 141 # define GNULIB_defined_rpl_fcntl 1 142 # endif 143 # else 144 # if !@HAVE_FCNTL@ 145 _GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...)); 146 # if !GNULIB_defined_fcntl 147 # define GNULIB_defined_fcntl 1 148 # endif 149 # endif 150 _GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...)); 151 # endif 152 _GL_CXXALIASWARN (fcntl); 153 #elif defined GNULIB_POSIXCHECK 154 # undef fcntl 155 # if HAVE_RAW_DECL_FCNTL 156 _GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - " 157 "use gnulib module fcntl for portability"); 158 # endif 159 #endif 160 161 #if @GNULIB_OPEN@ 162 # if @REPLACE_OPEN@ 163 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 164 # undef open 165 # define open rpl_open 166 # endif 167 _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) 168 _GL_ARG_NONNULL ((1))); 169 _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); 170 # elif defined _WIN32 && !defined __CYGWIN__ 171 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 172 # undef open 173 # define open _open 174 # endif 175 _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...)); 176 # else 177 _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); 178 # endif 179 /* On HP-UX 11, in C++ mode, open() is defined as an inline function with a 180 default argument. _GL_CXXALIASWARN does not work in this case. */ 181 # if !defined __hpux 182 _GL_CXXALIASWARN (open); 183 # endif 184 #elif defined GNULIB_POSIXCHECK 185 # undef open 186 /* Assume open is always declared. */ 187 _GL_WARN_ON_USE (open, "open is not always POSIX compliant - " 188 "use gnulib module open for portability"); 189 #elif @GNULIB_MDA_OPEN@ 190 /* On native Windows, map 'open' to '_open', so that -loldnames is not 191 required. In C++ with GNULIB_NAMESPACE, avoid differences between 192 platforms by defining GNULIB_NAMESPACE::open always. */ 193 # if defined _WIN32 && !defined __CYGWIN__ 194 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 195 # undef open 196 # define open _open 197 # endif 198 _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...)); 199 # else 200 _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); 201 # endif 202 # if !defined __hpux 203 _GL_CXXALIASWARN (open); 204 # endif 205 #endif 206 207 #if @GNULIB_OPENAT@ 208 # if @REPLACE_OPENAT@ 209 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 210 # undef openat 211 # define openat rpl_openat 212 # endif 213 _GL_FUNCDECL_RPL (openat, int, 214 (int fd, char const *file, int flags, /* mode_t mode */ ...) 215 _GL_ARG_NONNULL ((2))); 216 _GL_CXXALIAS_RPL (openat, int, 217 (int fd, char const *file, int flags, /* mode_t mode */ ...)); 218 # else 219 # if !@HAVE_OPENAT@ 220 _GL_FUNCDECL_SYS (openat, int, 221 (int fd, char const *file, int flags, /* mode_t mode */ ...) 222 _GL_ARG_NONNULL ((2))); 223 # endif 224 _GL_CXXALIAS_SYS (openat, int, 225 (int fd, char const *file, int flags, /* mode_t mode */ ...)); 226 # endif 227 _GL_CXXALIASWARN (openat); 228 #elif defined GNULIB_POSIXCHECK 229 # undef openat 230 # if HAVE_RAW_DECL_OPENAT 231 _GL_WARN_ON_USE (openat, "openat is not portable - " 232 "use gnulib module openat for portability"); 233 # endif 234 #endif 235 236 237 /* Fix up the FD_* macros, only known to be missing on mingw. */ 238 239 #ifndef FD_CLOEXEC 240 # define FD_CLOEXEC 1 241 #endif 242 243 /* Fix up the supported F_* macros. Intentionally leave other F_* 244 macros undefined. Only known to be missing on mingw. */ 245 246 #ifndef F_DUPFD_CLOEXEC 247 # define F_DUPFD_CLOEXEC 0x40000000 248 /* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */ 249 # define GNULIB_defined_F_DUPFD_CLOEXEC 1 250 #else 251 # define GNULIB_defined_F_DUPFD_CLOEXEC 0 252 #endif 253 254 #ifndef F_DUPFD 255 # define F_DUPFD 1 256 #endif 257 258 #ifndef F_GETFD 259 # define F_GETFD 2 260 #endif 261 262 /* Fix up the O_* macros. */ 263 264 /* AIX 7.1 with XL C 12.1 defines O_CLOEXEC, O_NOFOLLOW, and O_TTY_INIT 265 to values outside 'int' range, so omit these misdefinitions. 266 But avoid namespace pollution on non-AIX systems. */ 267 #ifdef _AIX 268 # include <limits.h> 269 # if defined O_CLOEXEC && ! (INT_MIN <= O_CLOEXEC && O_CLOEXEC <= INT_MAX) 270 # undef O_CLOEXEC 271 # endif 272 # if defined O_NOFOLLOW && ! (INT_MIN <= O_NOFOLLOW && O_NOFOLLOW <= INT_MAX) 273 # undef O_NOFOLLOW 274 # endif 275 # if defined O_TTY_INIT && ! (INT_MIN <= O_TTY_INIT && O_TTY_INIT <= INT_MAX) 276 # undef O_TTY_INIT 277 # endif 278 #endif 279 280 #if !defined O_DIRECT && defined O_DIRECTIO 281 /* Tru64 spells it 'O_DIRECTIO'. */ 282 # define O_DIRECT O_DIRECTIO 283 #endif 284 285 #if !defined O_CLOEXEC && defined O_NOINHERIT 286 /* Mingw spells it 'O_NOINHERIT'. */ 287 # define O_CLOEXEC O_NOINHERIT 288 #endif 289 290 #ifndef O_CLOEXEC 291 # define O_CLOEXEC 0x40000000 /* Try to not collide with system O_* flags. */ 292 # define GNULIB_defined_O_CLOEXEC 1 293 #else 294 # define GNULIB_defined_O_CLOEXEC 0 295 #endif 296 297 #ifndef O_DIRECT 298 # define O_DIRECT 0 299 #endif 300 301 #ifndef O_DIRECTORY 302 # define O_DIRECTORY 0 303 #endif 304 305 #ifndef O_DSYNC 306 # define O_DSYNC 0 307 #endif 308 309 #ifndef O_EXEC 310 # define O_EXEC O_RDONLY /* This is often close enough in older systems. */ 311 #endif 312 313 #ifndef O_IGNORE_CTTY 314 # define O_IGNORE_CTTY 0 315 #endif 316 317 #ifndef O_NDELAY 318 # define O_NDELAY 0 319 #endif 320 321 #ifndef O_NOATIME 322 # define O_NOATIME 0 323 #endif 324 325 #ifndef O_NONBLOCK 326 # define O_NONBLOCK O_NDELAY 327 #endif 328 329 /* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero 330 value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY 331 or to 0 as fallback. */ 332 #if @GNULIB_NONBLOCKING@ 333 # if O_NONBLOCK 334 # define GNULIB_defined_O_NONBLOCK 0 335 # else 336 # define GNULIB_defined_O_NONBLOCK 1 337 # undef O_NONBLOCK 338 # define O_NONBLOCK 0x40000000 339 # endif 340 #endif 341 342 #ifndef O_NOCTTY 343 # define O_NOCTTY 0 344 #endif 345 346 #ifndef O_NOFOLLOW 347 # define O_NOFOLLOW 0 348 #endif 349 350 #ifndef O_NOLINK 351 # define O_NOLINK 0 352 #endif 353 354 #ifndef O_NOLINKS 355 # define O_NOLINKS 0 356 #endif 357 358 #ifndef O_NOTRANS 359 # define O_NOTRANS 0 360 #endif 361 362 #ifndef O_RSYNC 363 # define O_RSYNC 0 364 #endif 365 366 #ifndef O_SEARCH 367 # define O_SEARCH O_RDONLY /* This is often close enough in older systems. */ 368 #endif 369 370 #ifndef O_SYNC 371 # define O_SYNC 0 372 #endif 373 374 #ifndef O_TTY_INIT 375 # define O_TTY_INIT 0 376 #endif 377 378 #if ~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) 379 # undef O_ACCMODE 380 # define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH) 381 #endif 382 383 /* For systems that distinguish between text and binary I/O. 384 O_BINARY is usually declared in fcntl.h */ 385 #if !defined O_BINARY && defined _O_BINARY 386 /* For MSC-compatible compilers. */ 387 # define O_BINARY _O_BINARY 388 # define O_TEXT _O_TEXT 389 #endif 390 391 #if defined __BEOS__ || defined __HAIKU__ 392 /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */ 393 # undef O_BINARY 394 # undef O_TEXT 395 #endif 396 397 #ifndef O_BINARY 398 # define O_BINARY 0 399 # define O_TEXT 0 400 #endif 401 402 /* Fix up the AT_* macros. */ 403 404 /* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its 405 value exceeds INT_MAX, so its use as an int doesn't conform to the 406 C standard, and GCC and Sun C complain in some cases. If the bug 407 is present, undef AT_FDCWD here, so it can be redefined below. */ 408 #if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553 409 # undef AT_FDCWD 410 #endif 411 412 /* Use the same bit pattern as Solaris 9, but with the proper 413 signedness. The bit pattern is important, in case this actually is 414 Solaris with the above workaround. */ 415 #ifndef AT_FDCWD 416 # define AT_FDCWD (-3041965) 417 #endif 418 419 /* Use the same values as Solaris 9. This shouldn't matter, but 420 there's no real reason to differ. */ 421 #ifndef AT_SYMLINK_NOFOLLOW 422 # define AT_SYMLINK_NOFOLLOW 4096 423 #endif 424 425 #ifndef AT_REMOVEDIR 426 # define AT_REMOVEDIR 1 427 #endif 428 429 /* Solaris 9 lacks these two, so just pick unique values. */ 430 #ifndef AT_SYMLINK_FOLLOW 431 # define AT_SYMLINK_FOLLOW 2 432 #endif 433 434 #ifndef AT_EACCESS 435 # define AT_EACCESS 4 436 #endif 437 438 439 #endif /* _@GUARD_PREFIX@_FCNTL_H */ 440 #endif /* _@GUARD_PREFIX@_FCNTL_H */ 441 #endif 442