diff options
author | Eric Blake <ebb9@byu.net> | 2009-12-07 11:50:59 -0700 |
---|---|---|
committer | Eric Blake <ebb9@byu.net> | 2009-12-16 19:25:30 -0700 |
commit | 38f87b03c2763bb2af05ae98905b0ac8ba55b3eb (patch) | |
tree | 1ee5e48a45fd0aec3288652fdd1f195fc7474d51 /lib/fcntl.in.h | |
parent | 12126c1477f0ae1070c51ed76025f21cb6ea56e7 (diff) | |
download | gnulib-38f87b03c2763bb2af05ae98905b0ac8ba55b3eb.tar.gz |
fcntl: support F_DUPFD_CLOEXEC on systems with fcntl
Implement F_DUPFD_CLOEXEC. The unit test still fails on systems
with other fcntl bugs (such as cygwin 1.5 mishandling F_DUPFD,
or mingw lacking fcntl altogether). Passes on Linux, both with
and without kernel support, and on cygwin 1.7.
* modules/fcntl (Files): List new files.
(configure.ac): Run a test.
* m4/fcntl.m4 (gl_FUNC_FCNTL): New file.
* lib/fcntl.c (rpl_fcntl): Likewise.
* m4/fcntl_h.m4 (gl_FCNTL_H_DEFAULTS): Add witness defaults.
(gl_FCNTL_H): Always replace fcntl.h.
* modules/fcntl-h (Makefile.am): Substitute witnesses.
* lib/fcntl.in.h (fcntl): Declare replacement.
(F_DUPFD_CLOEXEC, GNULIB_defined_F_DUPFD_CLOEXEC): New macro when
needed, plus a witness.
* doc/posix-functions/fcntl.texi (fcntl): Document this.
* doc/posix-headers/fcntl.texi (fcntl.h): Likewise.
* tests/test-fcntl.c: New file.
* modules/fcntl-tests: Likewise.
Signed-off-by: Eric Blake <ebb9@byu.net>
Diffstat (limited to 'lib/fcntl.in.h')
-rw-r--r-- | lib/fcntl.in.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/lib/fcntl.in.h b/lib/fcntl.in.h index 953e065f0d..34ea1cfc81 100644 --- a/lib/fcntl.in.h +++ b/lib/fcntl.in.h @@ -55,6 +55,20 @@ extern "C" { #endif +#if @GNULIB_FCNTL@ +# if @REPLACE_FCNTL@ +# undef fcntl +# define fcntl rpl_fcntl +extern int fcntl (int fd, int action, ...); +# endif +#elif defined GNULIB_POSIXCHECK +# undef fcntl +# define fcntl \ + (GL_LINK_WARNING ("fcntl is not always POSIX compliant - " \ + "use gnulib module fcntl for portability"), \ + fcntl) +#endif + #if @GNULIB_OPEN@ # if @REPLACE_OPEN@ # undef open @@ -96,6 +110,17 @@ extern int openat (int fd, char const *file, int flags, /* mode_t mode */ ...) # define FD_CLOEXEC 1 #endif +/* Fix up the supported F_* macros. Intentionally leave other F_* + macros undefined. */ + +#ifndef F_DUPFD_CLOEXEC +# define F_DUPFD_CLOEXEC 0x40000000 +/* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */ +# define GNULIB_defined_F_DUPFD_CLOEXEC 1 +#else +# define GNULIB_defined_F_DUPFD_CLOEXEC 0 +#endif + /* Fix up the O_* macros. */ #if !defined O_DIRECT && defined O_DIRECTIO |