summaryrefslogtreecommitdiff
path: root/lib/fcntl.in.h
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2009-12-07 11:50:59 -0700
committerEric Blake <ebb9@byu.net>2009-12-16 19:25:30 -0700
commit38f87b03c2763bb2af05ae98905b0ac8ba55b3eb (patch)
tree1ee5e48a45fd0aec3288652fdd1f195fc7474d51 /lib/fcntl.in.h
parent12126c1477f0ae1070c51ed76025f21cb6ea56e7 (diff)
downloadgnulib-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.h25
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