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