+2010-09-10 Paul Eggert <eggert@cs.ucla.edu>
+
+ fcntl-h: define O_CLOEXEC and O_EXEC if not defined; use new defines
+ * doc/posix-headers/fcntl.texi (fcntl.h): Document that
+ O_CLOEXEC is now defined to 0 if it is not defined, like other flags.
+ Also, O_EXEC is now defined to be O_RDONLY if O_EXEC is not defined.
+ Similarly for O_SEARCH; this last was already true, but not documented.
+ * lib/fcntl.in.h (O_CLOEXEC): Define to 0 if not defined.
+ * lib/dup-safer-flag.c (O_CLOEXEC): Remove now-useless #define.
+ * lib/dup3.c, lib/pipe2.c, tests/test-dup-safer.c, tests/test-fcntl.c:
+ Likewise.
+ * lib/popen-safer.c (open_noinherit): Check whether O_CLOEXEC
+ is zero, not whether it is defined.
+ * tests/test-dup3.c, tests/test-pipe2.c (main): Likewise.
+ * lib/progreloc.c (find_executable): Use O_EXEC rather than O_RDONLY.
+ * lib/open.c (open): Check for O_SEARCH as well as for O_RDONLY.
+
2010-09-10 Bruno Haible <bruno@clisp.org>
langinfo, nl_langinfo: Fix for IRIX 5.3.
Portability problems fixed by Gnulib:
@itemize
@item
-@samp{O_NOCTTY}, @samp{O_DSYNC}, @samp{O_NONBLOCK}, @samp{O_RSYNC},
-@samp{O_SYNC}, @samp{O_DIRECTORY}, @samp{O_NOFOLLOW}, and
-@samp{O_TTY_INIT} are not defined on some platforms.
+@samp{O_CLOEXEC}, @samp{O_DIRECTORY}, @samp{O_DSYNC}, @samp{O_NOCTTY},
+@samp{O_NOFOLLOW}, @samp{O_NONBLOCK}, @samp{O_RSYNC}, @samp{O_SYNC},
+and @samp{O_TTY_INIT} are not defined on some platforms. Gnulib defines
+these macros to 0.
+
+@item
+@samp{O_EXEC} and @samp{O_SEARCH} are not defined on some platforms.
+Gnulib defines these macros to @samp{O_RDONLY}, which is typically 0.
@item
@samp{O_BINARY}, @samp{O_TEXT} (not specified by POSIX, but essential for
Portability problems not fixed by Gnulib:
@itemize
-@item
-@samp{O_CLOEXEC} is not defined on some platforms. The gnulib
-replacement is not atomic on these platforms.
-
-@item
-@samp{O_SEARCH} and @samp{O_EXEC} are not defined
-on some platforms.
-
@item
@samp{F_SETFD}, @samp{F_GETFL}, @samp{F_SETFL}, @samp{F_GETLK},
@samp{F_SETLK}, @samp{F_SETLOKW}, @samp{F_GETOWN}, and @samp{F_SETOWN}
#include "cloexec.h"
-#ifndef O_CLOEXEC
-# define O_CLOEXEC 0
-#endif
-
/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
STDERR_FILENO. If FLAG contains O_CLOEXEC, behave like
fcntl(F_DUPFD_CLOEXEC) rather than fcntl(F_DUPFD). */
/* Upper bound on getdtablesize(). See lib/getdtablesize.c. */
# define OPEN_MAX_MAX 0x10000
-#else
-/* Unix API. */
-
-# ifndef O_CLOEXEC
-# define O_CLOEXEC 0
-# endif
-
#endif
int
# define O_CLOEXEC O_NOINHERIT
#endif
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
#ifndef O_DIRECT
# define O_DIRECT 0
#endif
# define O_DSYNC 0
#endif
+#ifndef O_EXEC
+# define O_EXEC O_RDONLY /* This is often close enough in older systems. */
+#endif
+
#ifndef O_NDELAY
# define O_NDELAY 0
#endif
override fstat() in fchdir.c to hide the fact that we have a
dummy. */
if (REPLACE_OPEN_DIRECTORY && fd < 0 && errno == EACCES
- && (flags & O_ACCMODE) == O_RDONLY)
+ && ((flags & O_ACCMODE) == O_RDONLY
+ || (O_SEARCH != O_RDONLY && (flags & O_ACCMODE) == O_SEARCH)))
{
struct stat statbuf;
if (stat (filename, &statbuf) == 0 && S_ISDIR (statbuf.st_mode))
# include <io.h>
-#else
-/* Unix API. */
-
-# ifndef O_CLOEXEC
-# define O_CLOEXEC 0
-# endif
-
#endif
int
open_noinherit (char const *name, int flags)
{
int fd;
-#ifdef O_CLOEXEC
+#if O_CLOEXEC
/* 0 = unknown, 1 = yes, -1 = no. */
static int have_cloexec;
if (have_cloexec >= 0)
if (link != NULL && link[0] != '[')
return link;
if (executable_fd < 0)
- executable_fd = open ("/proc/self/exe", O_RDONLY, 0);
+ executable_fd = open ("/proc/self/exe", O_EXEC, 0);
{
char buf[6+10+5];
if (link != NULL && link[0] != '[')
return link;
if (executable_fd < 0)
- executable_fd = open (buf, O_RDONLY, 0);
+ executable_fd = open (buf, O_EXEC, 0);
}
}
#endif
# define setmode(f,m) zero ()
static int zero (void) { return 0; }
#endif
-#ifndef O_CLOEXEC
-# define O_CLOEXEC 0
-#endif
/* This test intentionally closes stderr. So, we arrange to have fd 10
(outside the range of interesting fd's during the test) set up to
{
int use_cloexec;
-#if defined O_CLOEXEC
+#if O_CLOEXEC
for (use_cloexec = 0; use_cloexec <= 1; use_cloexec++)
#else
use_cloexec = 0;
char buffer[1];
o_flags = 0;
-#if defined O_CLOEXEC
+#if O_CLOEXEC
if (use_cloexec)
o_flags |= O_CLOEXEC;
#endif
#include "binary-io.h"
#include "macros.h"
-/* Use O_CLOEXEC if available, but test works without it. */
-#ifndef O_CLOEXEC
-# define O_CLOEXEC 0
-#endif
-
#if !O_BINARY
# define setmode(f,m) zero ()
static int zero (void) { return 0; }
#else
use_nonblocking = 0;
#endif
-#if defined O_CLOEXEC
+#if O_CLOEXEC
for (use_cloexec = 0; use_cloexec <= 1; use_cloexec++)
#else
use_cloexec = 0;
if (use_nonblocking)
o_flags |= O_NONBLOCK;
#endif
-#if defined O_CLOEXEC
+#if O_CLOEXEC
if (use_cloexec)
o_flags |= O_CLOEXEC;
#endif