changeset 16256:e32fc9c363fe

posix_spawn_file_actions_adddup2: Work around Solaris 11 2011-11 bug. * m4/spawn_h.m4 (gl_SPAWN_H_DEFAULTS): Initialize REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2. * m4/posix_spawn.m4 (gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2): New macro. * lib/spawn.in.h (posix_spawn_file_actions_adddup2): Test REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2, not REPLACE_POSIX_SPAWN. * lib/spawn_faction_adddup2.c: Add workaround implementation if HAVE_WORKING_POSIX_SPAWN. * modules/spawn (Makefile): Substitute REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2. * modules/posix_spawn_file_actions_adddup2 (configure.ac): Invoke gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2. Test REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2, not REPLACE_POSIX_SPAWN. (Depends-on): Update conditions. * doc/posix-functions/posix_spawn_file_actions_adddup2.texi: Mention the Solaris 11 bug.
author Bruno Haible <bruno@clisp.org>
date Sun, 08 Jan 2012 22:18:30 +0100
parents e5b440980b6c
children a5001764146b
files ChangeLog doc/posix-functions/posix_spawn_file_actions_adddup2.texi lib/spawn.in.h lib/spawn_faction_adddup2.c m4/posix_spawn.m4 m4/spawn_h.m4 modules/posix_spawn_file_actions_adddup2 modules/spawn
diffstat 8 files changed, 92 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Jan 08 22:00:12 2012 +0100
+++ b/ChangeLog	Sun Jan 08 22:18:30 2012 +0100
@@ -1,3 +1,23 @@
+2012-01-08  Bruno Haible  <bruno@clisp.org>
+
+	posix_spawn_file_actions_adddup2: Work around Solaris 11 2011-11 bug.
+	* m4/spawn_h.m4 (gl_SPAWN_H_DEFAULTS): Initialize
+	REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2.
+	* m4/posix_spawn.m4 (gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2): New
+	macro.
+	* lib/spawn.in.h (posix_spawn_file_actions_adddup2): Test
+	REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2, not REPLACE_POSIX_SPAWN.
+	* lib/spawn_faction_adddup2.c: Add workaround implementation if
+	HAVE_WORKING_POSIX_SPAWN.
+	* modules/spawn (Makefile): Substitute
+	REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2.
+	* modules/posix_spawn_file_actions_adddup2 (configure.ac): Invoke
+	gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2. Test
+	REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2, not REPLACE_POSIX_SPAWN.
+	(Depends-on): Update conditions.
+	* doc/posix-functions/posix_spawn_file_actions_adddup2.texi: Mention
+	the Solaris 11 bug.
+
 2012-01-08  Bruno Haible  <bruno@clisp.org>
 
 	posix_spawn_file_actions_addclose: Work around Solaris 11 2011-11 bug.
--- a/doc/posix-functions/posix_spawn_file_actions_adddup2.texi	Sun Jan 08 22:00:12 2012 +0100
+++ b/doc/posix-functions/posix_spawn_file_actions_adddup2.texi	Sun Jan 08 22:18:30 2012 +0100
@@ -11,6 +11,9 @@
 @item
 This function is missing on some platforms:
 MacOS X 10.4, FreeBSD 6.0, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, MSVC 9, Interix 3.5, BeOS.
+@item
+This function does not reject a too large file descriptor on some platforms:
+Solaris 11 2011-11.
 @end itemize
 
 Portability problems not fixed by Gnulib:
--- a/lib/spawn.in.h	Sun Jan 08 22:00:12 2012 +0100
+++ b/lib/spawn.in.h	Sun Jan 08 22:18:30 2012 +0100
@@ -844,7 +844,7 @@
 #if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'dup2' for the given file descriptors during the 'spawn' call.  */
-# if @REPLACE_POSIX_SPAWN@
+# if @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define posix_spawn_file_actions_adddup2 rpl_posix_spawn_file_actions_adddup2
 #  endif
--- a/lib/spawn_faction_adddup2.c	Sun Jan 08 22:00:12 2012 +0100
+++ b/lib/spawn_faction_adddup2.c	Sun Jan 08 22:18:30 2012 +0100
@@ -26,35 +26,45 @@
 # define __sysconf(open_max) getdtablesize ()
 #endif
 
-#include "spawn_int.h"
+#if !HAVE_WORKING_POSIX_SPAWN
+# include "spawn_int.h"
+#endif
 
 /* Add an action to FILE-ACTIONS which tells the implementation to call
    'dup2' for the given file descriptors during the 'spawn' call.  */
 int
 posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *file_actions,
                                   int fd, int newfd)
+#undef posix_spawn_file_actions_adddup2
 {
   int maxfd = __sysconf (_SC_OPEN_MAX);
-  struct __spawn_action *rec;
 
   /* Test for the validity of the file descriptor.  */
   if (fd < 0 || newfd < 0 || fd >= maxfd || newfd >= maxfd)
     return EBADF;
 
+#if HAVE_WORKING_POSIX_SPAWN
+  return posix_spawn_file_actions_adddup2 (file_actions, fd, newfd);
+#else
   /* Allocate more memory if needed.  */
   if (file_actions->_used == file_actions->_allocated
       && __posix_spawn_file_actions_realloc (file_actions) != 0)
     /* This can only mean we ran out of memory.  */
     return ENOMEM;
 
-  /* Add the new value.  */
-  rec = &file_actions->_actions[file_actions->_used];
-  rec->tag = spawn_do_dup2;
-  rec->action.dup2_action.fd = fd;
-  rec->action.dup2_action.newfd = newfd;
+  {
+    struct __spawn_action *rec;
 
-  /* Account for the new entry.  */
-  ++file_actions->_used;
+    /* Add the new value.  */
+    rec = &file_actions->_actions[file_actions->_used];
+    rec->tag = spawn_do_dup2;
+    rec->action.dup2_action.fd = fd;
+    rec->action.dup2_action.newfd = newfd;
 
-  return 0;
+    /* Account for the new entry.  */
+    ++file_actions->_used;
+
+    return 0;
+  }
+#endif
 }
--- a/m4/posix_spawn.m4	Sun Jan 08 22:00:12 2012 +0100
+++ b/m4/posix_spawn.m4	Sun Jan 08 22:18:30 2012 +0100
@@ -441,3 +441,44 @@
     esac
   fi
 ])
+
+AC_DEFUN([gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2],
+[
+  AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  gl_POSIX_SPAWN
+  if test $REPLACE_POSIX_SPAWN = 1; then
+    REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1
+  else
+    dnl On Solaris 11 2011-11, posix_spawn_file_actions_adddup2 succeeds even
+    dnl if the fd argument is out of range.
+    AC_CACHE_CHECK([whether posix_spawn_file_actions_adddup2 works],
+      [gl_cv_func_posix_spawn_file_actions_adddup2_works],
+      [AC_RUN_IFELSE(
+         [AC_LANG_SOURCE([[
+#include <spawn.h>
+int main ()
+{
+  posix_spawn_file_actions_t actions;
+  if (posix_spawn_file_actions_init (&actions) != 0)
+    return 1;
+  if (posix_spawn_file_actions_adddup2 (&actions, 10000000, 2) == 0)
+    return 2;
+  return 0;
+}]])],
+         [gl_cv_func_posix_spawn_file_actions_adddup2_works=yes],
+         [gl_cv_func_posix_spawn_file_actions_adddup2_works=no],
+         [# Guess no on Solaris, yes otherwise.
+          case "$host_os" in
+            solaris*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
+            *)        gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing yes";;
+          esac
+         ])
+      ])
+    case "$gl_cv_func_posix_spawn_file_actions_adddup2_works" in
+      *yes) ;;
+      *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1 ;;
+    esac
+  fi
+])
--- a/m4/spawn_h.m4	Sun Jan 08 22:00:12 2012 +0100
+++ b/m4/spawn_h.m4	Sun Jan 08 22:18:30 2012 +0100
@@ -110,4 +110,6 @@
   REPLACE_POSIX_SPAWN=0;     AC_SUBST([REPLACE_POSIX_SPAWN])
   REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;
                              AC_SUBST([REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE])
+  REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;
+                             AC_SUBST([REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2])
 ])
--- a/modules/posix_spawn_file_actions_adddup2	Sun Jan 08 22:00:12 2012 +0100
+++ b/modules/posix_spawn_file_actions_adddup2	Sun Jan 08 22:18:30 2012 +0100
@@ -9,12 +9,12 @@
 
 Depends-on:
 spawn
-getdtablesize                 [test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1]
-posix_spawn_file_actions_init [test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1]
+getdtablesize                 [test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1]
+posix_spawn_file_actions_init [test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1]
 
 configure.ac:
-gl_POSIX_SPAWN
-if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
+if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1; then
   AC_LIBOBJ([spawn_faction_adddup2])
 fi
 gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_adddup2])
--- a/modules/spawn	Sun Jan 08 22:00:12 2012 +0100
+++ b/modules/spawn	Sun Jan 08 22:18:30 2012 +0100
@@ -55,6 +55,7 @@
 	      -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_T''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_T)|g' \
 	      -e 's|@''REPLACE_POSIX_SPAWN''@|$(REPLACE_POSIX_SPAWN)|g' \
 	      -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)|g' \
+	      -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)|g' \
 	      -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
 	      -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
 	      -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \