fcntl-h: define O_CLOEXEC and O_EXEC if not defined; use new defines
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 10 Sep 2010 18:55:27 +0000 (11:55 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 10 Sep 2010 18:55:27 +0000 (11:55 -0700)
* 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.

13 files changed:
ChangeLog
doc/posix-headers/fcntl.texi
lib/dup-safer-flag.c
lib/dup3.c
lib/fcntl.in.h
lib/open.c
lib/pipe2.c
lib/popen-safer.c
lib/progreloc.c
tests/test-dup-safer.c
tests/test-dup3.c
tests/test-fcntl.c
tests/test-pipe2.c

index 16f4a21..48a4d32 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+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.
index 993db2d..1e3f977 100644 (file)
@@ -8,9 +8,14 @@ Gnulib module: fcntl-h
 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
@@ -49,14 +54,6 @@ Solaris 10.
 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}
 are not defined on some platforms:
index 10d6a1b..e4c0597 100644 (file)
 
 #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).  */
index d44aa92..5ae8b44 100644 (file)
 /* 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
index 42fb81b..a7e4a95 100644 (file)
@@ -170,6 +170,10 @@ _GL_WARN_ON_USE (openat, "openat is not portable - "
 # define O_CLOEXEC O_NOINHERIT
 #endif
 
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
 #ifndef O_DIRECT
 # define O_DIRECT 0
 #endif
@@ -182,6 +186,10 @@ _GL_WARN_ON_USE (openat, "openat is not portable - "
 # 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
index f612b80..4e44936 100644 (file)
@@ -111,7 +111,8 @@ open (const char *filename, int flags, ...)
      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))
index 2d973dc..8257fcf 100644 (file)
 
 # include <io.h>
 
-#else
-/* Unix API.  */
-
-# ifndef O_CLOEXEC
-#  define O_CLOEXEC 0
-# endif
-
 #endif
 
 int
index 1791bc3..be67c76 100644 (file)
@@ -34,7 +34,7 @@ static 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)
index 1e27de7..19bbc12 100644 (file)
@@ -189,7 +189,7 @@ find_executable (const char *argv0)
     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];
@@ -198,7 +198,7 @@ find_executable (const char *argv0)
       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
index 28f1317..b71b6c3 100644 (file)
@@ -38,9 +38,6 @@
 # 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
index a719234..f1e978b 100644 (file)
@@ -75,7 +75,7 @@ main ()
 {
   int use_cloexec;
 
-#if defined O_CLOEXEC
+#if O_CLOEXEC
   for (use_cloexec = 0; use_cloexec <= 1; use_cloexec++)
 #else
   use_cloexec = 0;
@@ -87,7 +87,7 @@ main ()
       char buffer[1];
 
       o_flags = 0;
-#if defined O_CLOEXEC
+#if O_CLOEXEC
       if (use_cloexec)
         o_flags |= O_CLOEXEC;
 #endif
index 71dfb98..a181da3 100644 (file)
@@ -39,11 +39,6 @@ SIGNATURE_CHECK (fcntl, int, (int, int, ...));
 #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; }
index bd6df7c..e8e5798 100644 (file)
@@ -92,7 +92,7 @@ main ()
 #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;
@@ -106,7 +106,7 @@ main ()
         if (use_nonblocking)
           o_flags |= O_NONBLOCK;
 #endif
-#if defined O_CLOEXEC
+#if O_CLOEXEC
         if (use_cloexec)
           o_flags |= O_CLOEXEC;
 #endif