changeset 30195:418dfe90256c

New module 'spawn'.
author Bruno Haible <bruno@clisp.org>
date Sun, 28 Sep 2008 13:26:56 +0200
parents b647fd7bb382
children c3eeb3b0bffd
files ChangeLog doc/posix-headers/spawn.texi lib/spawn.in.h m4/spawn_h.m4 modules/spawn
diffstat 5 files changed, 524 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Sep 28 13:24:13 2008 +0200
+++ b/ChangeLog	Sun Sep 28 13:26:56 2008 +0200
@@ -1,3 +1,11 @@
+2008-09-28  Bruno Haible  <bruno@clisp.org>
+
+	New module 'spawn'.
+	* modules/spawn: New file.
+	* lib/spawn.in.h: New file.
+	* m4/spawn_h.m4: New file.
+	* doc/posix-headers/spawn.texi: Mention the new module.
+
 2008-09-28  Bruno Haible  <bruno@clisp.org>
 
 	* modules/sched-tests: New file.
--- a/doc/posix-headers/spawn.texi	Sun Sep 28 13:24:13 2008 +0200
+++ b/doc/posix-headers/spawn.texi	Sun Sep 28 13:26:56 2008 +0200
@@ -3,16 +3,16 @@
 
 POSIX specification: @url{http://www.opengroup.org/susv3xbd/spawn.h.html}
 
-Gnulib module: ---
+Gnulib module: spawn
 
 Portability problems fixed by Gnulib:
 @itemize
-@end itemize
-
-Portability problems not fixed by Gnulib:
-@itemize
 @item
 This header file is missing on some platforms:
 MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11,
 IRIX 6.5, OSF/1 5.1, Cygwin, mingw, Interix 3.5, BeOS.
 @end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
+@end itemize
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/spawn.in.h	Sun Sep 28 13:26:56 2008 +0200
@@ -0,0 +1,377 @@
+/* Definitions for POSIX spawn interface.
+   Copyright (C) 2000, 2003, 2004, 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_SPAWN_H
+
+@PRAGMA_SYSTEM_HEADER@
+
+/* The include_next requires a split double-inclusion guard.  */
+#if @HAVE_SPAWN_H@
+# @INCLUDE_NEXT@ @NEXT_SPAWN_H@
+#endif
+
+#ifndef _GL_SPAWN_H
+#define _GL_SPAWN_H
+
+#include <sched.h>
+#include <signal.h>
+#include <sys/types.h>
+
+#ifndef __THROW
+# define __THROW
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+   "restrict", and "configure" may have defined "restrict".
+   Other compilers use __restrict, __restrict__, and _Restrict, and
+   'configure' might #define 'restrict' to those words, so pick a
+   different name.  */
+#ifndef _Restrict_
+# if 199901L <= __STDC_VERSION__
+#  define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+#  define _Restrict_ __restrict
+# else
+#  define _Restrict_
+# endif
+#endif
+/* gcc 3.1 and up support the [restrict] syntax.  Don't trust
+   sys/cdefs.h's definition of __restrict_arr, though, as it
+   mishandles gcc -ansi -pedantic.  */
+#ifndef _Restrict_arr_
+# if ((199901L <= __STDC_VERSION__					\
+       || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__))	\
+	   && !__STRICT_ANSI__))					\
+      && !defined __GNUG__)
+#  define _Restrict_arr_ _Restrict_
+# else
+#  define _Restrict_arr_
+# endif
+#endif
+
+/* The definition of GL_LINK_WARNING is copied here.  */
+
+
+/* Data structure to contain attributes for thread creation.  */
+#if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_t rpl_posix_spawnattr_t
+#endif
+typedef struct
+{
+  short int _flags;
+  pid_t _pgrp;
+  sigset_t _sd;
+  sigset_t _ss;
+  struct sched_param _sp;
+  int _policy;
+  int __pad[16];
+} posix_spawnattr_t;
+
+
+/* Data structure to contain information about the actions to be
+   performed in the new process with respect to file descriptors.  */
+#if @REPLACE_POSIX_SPAWN@
+# define posix_spawn_file_actions_t rpl_posix_spawn_file_actions_t
+#endif
+typedef struct
+{
+  int _allocated;
+  int _used;
+  struct __spawn_action *_actions;
+  int __pad[16];
+} posix_spawn_file_actions_t;
+
+
+/* Flags to be set in the `posix_spawnattr_t'.  */
+#define POSIX_SPAWN_RESETIDS		0x01
+#define POSIX_SPAWN_SETPGROUP		0x02
+#define POSIX_SPAWN_SETSIGDEF		0x04
+#define POSIX_SPAWN_SETSIGMASK		0x08
+#define POSIX_SPAWN_SETSCHEDPARAM	0x10
+#define POSIX_SPAWN_SETSCHEDULER	0x20
+/* A GNU extension.  */
+#define POSIX_SPAWN_USEVFORK		0x40
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if @GNULIB_POSIX_SPAWN@
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+   Before running the process perform the actions described in FILE-ACTIONS.
+
+   This function is a possible cancellation points and therefore not
+   marked with __THROW. */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawn rpl_posix_spawn
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn (pid_t *_Restrict_ __pid,
+			const char *_Restrict_ __path,
+			const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+			const posix_spawnattr_t *_Restrict_ __attrp,
+			char *const argv[_Restrict_arr_],
+			char *const envp[_Restrict_arr_]);
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNP@
+/* Similar to `posix_spawn' but search for FILE in the PATH.
+
+   This function is a possible cancellation points and therefore not
+   marked with __THROW.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnp rpl_posix_spawnp
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnp (pid_t *__pid, const char *__file,
+			 const posix_spawn_file_actions_t *__file_actions,
+			 const posix_spawnattr_t *__attrp,
+			 char *const argv[], char *const envp[]);
+# endif
+#endif
+
+
+#if @GNULIB_POSIX_SPAWNATTR_INIT@
+/* Initialize data structure with attributes for `spawn' to default values.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_init rpl_posix_spawnattr_init
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_init (posix_spawnattr_t *__attr) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_DESTROY@
+/* Free resources associated with ATTR.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_destroy rpl_posix_spawnattr_destroy
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_destroy (posix_spawnattr_t *__attr) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+/* Store signal mask for signals with default handling from ATTR in
+   SIGDEFAULT.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_getsigdefault rpl_posix_spawnattr_getsigdefault
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getsigdefault (const posix_spawnattr_t *_Restrict_ __attr,
+					  sigset_t *_Restrict_ __sigdefault)
+     __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+/* Set signal mask for signals with default handling in ATTR to SIGDEFAULT.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_setsigdefault rpl_posix_spawnattr_setsigdefault
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setsigdefault (posix_spawnattr_t *_Restrict_ __attr,
+					  const sigset_t *_Restrict_ __sigdefault)
+     __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+/* Store signal mask for the new process from ATTR in SIGMASK.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_getsigmask rpl_posix_spawnattr_getsigmask
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getsigmask (const posix_spawnattr_t *_Restrict_ __attr,
+				       sigset_t *_Restrict_ __sigmask) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+/* Set signal mask for the new process in ATTR to SIGMASK.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_setsigmask rpl_posix_spawnattr_setsigmask
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setsigmask (posix_spawnattr_t *_Restrict_ __attr,
+				       const sigset_t *_Restrict_ __sigmask)
+     __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+/* Get flag word from the attribute structure.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_getflags rpl_posix_spawnattr_getflags
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getflags (const posix_spawnattr_t *_Restrict_ __attr,
+				     short int *_Restrict_ __flags) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+/* Store flags in the attribute structure.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_setflags rpl_posix_spawnattr_setflags
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setflags (posix_spawnattr_t *__attr,
+				     short int __flags) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+/* Get process group ID from the attribute structure.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_getpgroup rpl_posix_spawnattr_getpgroup
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getpgroup (const posix_spawnattr_t *_Restrict_ __attr,
+				      pid_t *_Restrict_ __pgroup)
+     __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+/* Store process group ID in the attribute structure.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_setpgroup rpl_posix_spawnattr_setpgroup
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setpgroup (posix_spawnattr_t *__attr,
+				      pid_t __pgroup) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+/* Get scheduling policy from the attribute structure.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_getschedpolicy rpl_posix_spawnattr_getschedpolicy
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getschedpolicy (const posix_spawnattr_t *_Restrict_ __attr,
+					   int *_Restrict_ __schedpolicy)
+     __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+/* Store scheduling policy in the attribute structure.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_setschedpolicy rpl_posix_spawnattr_setschedpolicy
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setschedpolicy (posix_spawnattr_t *__attr,
+					   int __schedpolicy) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+/* Get scheduling parameters from the attribute structure.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_getschedparam rpl_posix_spawnattr_getschedparam
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_getschedparam (const posix_spawnattr_t *_Restrict_ __attr,
+					  struct sched_param *_Restrict_ __schedparam) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+/* Store scheduling parameters in the attribute structure.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawnattr_setschedparam rpl_posix_spawnattr_setschedparam
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawnattr_setschedparam (posix_spawnattr_t *_Restrict_ __attr,
+					  const struct sched_param *_Restrict_ __schedparam) __THROW;
+# endif
+#endif
+
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+/* Initialize data structure for file attribute for `spawn' call.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawn_file_actions_init rpl_posix_spawn_file_actions_init
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_init (posix_spawn_file_actions_t *__file_actions) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+/* Free resources associated with FILE-ACTIONS.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawn_file_actions_destroy rpl_posix_spawn_file_actions_destroy
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *__file_actions) __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+   `open' for the given file during the `spawn' call.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawn_file_actions_addopen rpl_posix_spawn_file_actions_addopen
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+					     int __fd,
+					     const char *_Restrict_ __path,
+					     int __oflag, mode_t __mode)
+     __THROW;
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+   `close' for the given file descriptor during the `spawn' call.  */
+# if @REPLACE_POSIX_SPAWN@
+#  define posix_spawn_file_actions_addclose rpl_posix_spawn_file_actions_addclose
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *__file_actions,
+					      int __fd)
+     __THROW;
+# endif
+#endif
+
+#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@
+#  define posix_spawn_file_actions_adddup2 rpl_posix_spawn_file_actions_adddup2
+# endif
+# if !@HAVE_POSIX_SPAWN@ || @REPLACE_POSIX_SPAWN@
+extern int posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *__file_actions,
+					     int __fd, int __newfd) __THROW;
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _GL_SPAWN_H */
+#endif /* _GL_SPAWN_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m4/spawn_h.m4	Sun Sep 28 13:26:56 2008 +0200
@@ -0,0 +1,69 @@
+# spawn_h.m4 serial 1
+dnl Copyright (C) 2008 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Bruno Haible.
+
+AC_DEFUN([gl_SPAWN_H],
+[
+  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+  dnl once only, before all statements that occur in other macros.
+  AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+
+  gl_CHECK_NEXT_HEADERS([spawn.h])
+
+  AC_CHECK_HEADERS_ONCE([spawn.h])
+  if test $ac_cv_header_spawn_h = yes; then
+    HAVE_SPAWN_H=1
+  else
+    HAVE_SPAWN_H=0
+  fi
+  AC_SUBST([HAVE_SPAWN_H])
+
+  AC_REQUIRE([AC_C_RESTRICT])
+])
+
+dnl Unconditionally enables the replacement of <spawn.h>.
+AC_DEFUN([gl_REPLACE_SPAWN_H],
+[
+  AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+  SPAWN_H='spawn.h'
+])
+
+AC_DEFUN([gl_SPAWN_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+  GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
+])
+
+AC_DEFUN([gl_SPAWN_H_DEFAULTS],
+[
+  GNULIB_POSIX_SPAWN=0;                       AC_SUBST([GNULIB_POSIX_SPAWN])
+  GNULIB_POSIX_SPAWNP=0;                      AC_SUBST([GNULIB_POSIX_SPAWNP])
+  GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=0;     AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT])
+  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE])
+  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;  AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2])
+  GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;  AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN])
+  GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=0;  AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY])
+  GNULIB_POSIX_SPAWNATTR_INIT=0;              AC_SUBST([GNULIB_POSIX_SPAWNATTR_INIT])
+  GNULIB_POSIX_SPAWNATTR_GETFLAGS=0;          AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETFLAGS])
+  GNULIB_POSIX_SPAWNATTR_SETFLAGS=0;          AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETFLAGS])
+  GNULIB_POSIX_SPAWNATTR_GETPGROUP=0;         AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETPGROUP])
+  GNULIB_POSIX_SPAWNATTR_SETPGROUP=0;         AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETPGROUP])
+  GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM=0;     AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM])
+  GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM=0;     AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM])
+  GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY=0;    AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY])
+  GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY=0;    AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY])
+  GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT=0;     AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT])
+  GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT=0;     AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT])
+  GNULIB_POSIX_SPAWNATTR_GETSIGMASK=0;        AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSIGMASK])
+  GNULIB_POSIX_SPAWNATTR_SETSIGMASK=0;        AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSIGMASK])
+  GNULIB_POSIX_SPAWNATTR_DESTROY=0;           AC_SUBST([GNULIB_POSIX_SPAWNATTR_DESTROY])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_POSIX_SPAWN=1;     AC_SUBST([HAVE_POSIX_SPAWN])
+  REPLACE_POSIX_SPAWN=0;  AC_SUBST([REPLACE_POSIX_SPAWN])
+  SPAWN_H='';             AC_SUBST([SPAWN_H])
+])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/spawn	Sun Sep 28 13:26:56 2008 +0200
@@ -0,0 +1,65 @@
+Description:
+A POSIX compliant <spawn.h>.
+
+Files:
+lib/spawn.in.h
+m4/spawn_h.m4
+
+Depends-on:
+include_next
+link-warning
+sched
+
+configure.ac:
+gl_SPAWN_H
+
+Makefile.am:
+BUILT_SOURCES += $(SPAWN_H)
+
+# We need the following in order to create a replacement for <spawn.h> when
+# the system doesn't have one.
+spawn.h: spawn.in.h
+	rm -f $@-t $@
+	{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+	  sed -e 's|@''HAVE_SPAWN_H''@|$(HAVE_SPAWN_H)|g' \
+	      -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+	      -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+	      -e 's|@''NEXT_SPAWN_H''@|$(NEXT_SPAWN_H)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWN''@|$(GNULIB_POSIX_SPAWN)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNP''@|$(GNULIB_POSIX_SPAWNP)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY''@|$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_INIT''@|$(GNULIB_POSIX_SPAWNATTR_INIT)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_GETFLAGS''@|$(GNULIB_POSIX_SPAWNATTR_GETFLAGS)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_SETFLAGS''@|$(GNULIB_POSIX_SPAWNATTR_SETFLAGS)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_GETPGROUP''@|$(GNULIB_POSIX_SPAWNATTR_GETPGROUP)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_SETPGROUP''@|$(GNULIB_POSIX_SPAWNATTR_SETPGROUP)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM''@|$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM''@|$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY''@|$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY''@|$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT''@|$(GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT''@|$(GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_GETSIGMASK''@|$(GNULIB_POSIX_SPAWNATTR_GETSIGMASK)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_SETSIGMASK''@|$(GNULIB_POSIX_SPAWNATTR_SETSIGMASK)|g' \
+	      -e 's|@''GNULIB_POSIX_SPAWNATTR_DESTROY''@|$(GNULIB_POSIX_SPAWNATTR_DESTROY)|g' \
+	      -e 's|@''HAVE_POSIX_SPAWN''@|$(HAVE_POSIX_SPAWN)|g' \
+	      -e 's|@''REPLACE_POSIX_SPAWN''@|$(REPLACE_POSIX_SPAWN)|g' \
+	      -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+	      < $(srcdir)/spawn.in.h; \
+	} > $@-t
+	mv $@-t $@
+MOSTLYCLEANFILES += spawn.h spawn.h-t
+
+Include:
+<spawn.h>
+
+License:
+LGPL
+
+Maintainer:
+Bruno Haible, glibc
+