X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fexecute.c;h=751dcb384bed3c0a535ef830ac2f398ec0b47b3e;hb=8de32ec2916ffe14843acf4a53a465a5d413577f;hp=df6b1eaa842cbcc10a8e98ea7ac586fd670061ed;hpb=d3d0152e409b77847917478f21df9d63d042f862;p=gnulib.git diff --git a/lib/execute.c b/lib/execute.c index df6b1eaa8..751dcb384 100644 --- a/lib/execute.c +++ b/lib/execute.c @@ -1,11 +1,11 @@ /* Creation of autonomous subprocesses. - Copyright (C) 2001-2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2001-2004, 2006-2008 Free Software Foundation, Inc. Written by Bruno Haible , 2001. - This program is free software; you can redistribute it and/or modify + 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 2, or (at your option) - any later version. + 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 @@ -13,13 +13,10 @@ 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, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif +#include /* Specification. */ #include "execute.h" @@ -32,7 +29,6 @@ #include #include "error.h" -#include "exit.h" #include "fatal-signal.h" #include "wait-process.h" #include "gettext.h" @@ -48,20 +44,16 @@ #else /* Unix API. */ -# ifdef HAVE_POSIX_SPAWN +# if HAVE_POSIX_SPAWN # include # else -# ifdef HAVE_VFORK_H +# if HAVE_VFORK_H # include # endif # endif #endif -#ifndef HAVE_ENVIRON_DECL -extern char **environ; -#endif - #ifndef STDIN_FILENO # define STDIN_FILENO 0 #endif @@ -72,6 +64,11 @@ extern char **environ; # define STDERR_FILENO 2 #endif +/* The results of open() in this file are not used with fchdir, + therefore save some unnecessary work in fchdir.c. */ +#undef open +#undef close + #ifdef EINTR @@ -120,7 +117,8 @@ execute (const char *progname, const char *prog_path, char **prog_argv, bool ignore_sigpipe, bool null_stdin, bool null_stdout, bool null_stderr, - bool slave_process, bool exit_on_error) + bool slave_process, bool exit_on_error, + int *termsigp) { #if defined _MSC_VER || defined __MINGW32__ @@ -176,6 +174,9 @@ execute (const char *progname, if (null_stdin) dup2 (orig_stdin, STDIN_FILENO), close (orig_stdin); + if (termsigp != NULL) + *termsigp = 0; + if (exitcode == -1) { if (exit_on_error || !null_stderr) @@ -254,6 +255,8 @@ execute (const char *progname, posix_spawnattr_destroy (&attrs); if (slave_process) unblock_fatal_signals (); + if (termsigp != NULL) + *termsigp = 0; if (exit_on_error || !null_stderr) error (exit_on_error ? EXIT_FAILURE : 0, err, _("%s subprocess failed"), progname); @@ -296,6 +299,8 @@ execute (const char *progname, { if (slave_process) unblock_fatal_signals (); + if (termsigp != NULL) + *termsigp = 0; if (exit_on_error || !null_stderr) error (exit_on_error ? EXIT_FAILURE : 0, errno, _("%s subprocess failed"), progname); @@ -309,7 +314,7 @@ execute (const char *progname, } return wait_subprocess (child, progname, ignore_sigpipe, null_stderr, - slave_process, exit_on_error); + slave_process, exit_on_error, termsigp); #endif }