changeset 13664:241057e2e60f

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.
author Paul Eggert <eggert@cs.ucla.edu>
date Fri, 10 Sep 2010 11:55:27 -0700
parents 9dc0f85b1c1c
children a660297efbdc
files 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
diffstat 13 files changed, 42 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Sep 10 20:23:49 2010 +0200
+++ b/ChangeLog	Fri Sep 10 11:55:27 2010 -0700
@@ -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.
--- a/doc/posix-headers/fcntl.texi	Fri Sep 10 20:23:49 2010 +0200
+++ b/doc/posix-headers/fcntl.texi	Fri Sep 10 11:55:27 2010 -0700
@@ -8,9 +8,14 @@
 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 @@
 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:
--- a/lib/dup-safer-flag.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/lib/dup-safer-flag.c	Fri Sep 10 11:55:27 2010 -0700
@@ -28,10 +28,6 @@
 
 #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).  */
--- a/lib/dup3.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/lib/dup3.c	Fri Sep 10 11:55:27 2010 -0700
@@ -38,13 +38,6 @@
 /* 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
--- a/lib/fcntl.in.h	Fri Sep 10 20:23:49 2010 +0200
+++ b/lib/fcntl.in.h	Fri Sep 10 11:55:27 2010 -0700
@@ -170,6 +170,10 @@
 # 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 @@
 # 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
--- a/lib/open.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/lib/open.c	Fri Sep 10 11:55:27 2010 -0700
@@ -111,7 +111,8 @@
      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))
--- a/lib/pipe2.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/lib/pipe2.c	Fri Sep 10 11:55:27 2010 -0700
@@ -30,13 +30,6 @@
 
 # include <io.h>
 
-#else
-/* Unix API.  */
-
-# ifndef O_CLOEXEC
-#  define O_CLOEXEC 0
-# endif
-
 #endif
 
 int
--- a/lib/popen-safer.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/lib/popen-safer.c	Fri Sep 10 11:55:27 2010 -0700
@@ -34,7 +34,7 @@
 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)
--- a/lib/progreloc.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/lib/progreloc.c	Fri Sep 10 11:55:27 2010 -0700
@@ -189,7 +189,7 @@
     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 @@
       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
--- a/tests/test-dup-safer.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/tests/test-dup-safer.c	Fri Sep 10 11:55:27 2010 -0700
@@ -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
--- a/tests/test-dup3.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/tests/test-dup3.c	Fri Sep 10 11:55:27 2010 -0700
@@ -75,7 +75,7 @@
 {
   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 @@
       char buffer[1];
 
       o_flags = 0;
-#if defined O_CLOEXEC
+#if O_CLOEXEC
       if (use_cloexec)
         o_flags |= O_CLOEXEC;
 #endif
--- a/tests/test-fcntl.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/tests/test-fcntl.c	Fri Sep 10 11:55:27 2010 -0700
@@ -39,11 +39,6 @@
 #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; }
--- a/tests/test-pipe2.c	Fri Sep 10 20:23:49 2010 +0200
+++ b/tests/test-pipe2.c	Fri Sep 10 11:55:27 2010 -0700
@@ -92,7 +92,7 @@
 #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 @@
         if (use_nonblocking)
           o_flags |= O_NONBLOCK;
 #endif
-#if defined O_CLOEXEC
+#if O_CLOEXEC
         if (use_cloexec)
           o_flags |= O_CLOEXEC;
 #endif