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