diff options
author | Mark Elbrecht <snowball3@usa.net> | 1999-03-24 23:35:34 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1999-03-24 16:35:34 -0700 |
commit | f3692274cb0ccbd2930de5a9c10901e4da531e00 (patch) | |
tree | 479786bd47a0234a2321c522b6d2deb3274a26b5 /gcc | |
parent | cc33944a7a4ad12e11ce9e278f028be948189575 (diff) | |
download | gcc-f3692274cb0ccbd2930de5a9c10901e4da531e00.zip gcc-f3692274cb0ccbd2930de5a9c10901e4da531e00.tar.gz gcc-f3692274cb0ccbd2930de5a9c10901e4da531e00.tar.bz2 |
system.h (STDIN_FILENO): Provide default definition if one is not provided by the system header files.
* system.h (STDIN_FILENO): Provide default definition if one is not
provided by the system header files.
(STDOUT_FILENO, STDERR_FILENO): Likewise.
* i386/xm-djgpp.h (COLLECT2_HOST_INITIALIZATION): New macro.
* collect2.c (main): Use it.
(pexecute_pid): New variable. Holds return value from call to pexecute.
(collect2_execute): Rework to use pexecute instead of fork.
(collect2_wait): Use pwait() instead of wait().
Co-Authored-By: Jeffrey A Law <law@cygnus.com>
From-SVN: r25960
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/collect2.c | 63 | ||||
-rw-r--r-- | gcc/config/i386/xm-djgpp.h | 6 | ||||
-rw-r--r-- | gcc/system.h | 11 |
4 files changed, 75 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 36dee71..879e7a5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -5,7 +5,18 @@ Tue Mar 23 15:45:25 1999 Richard Earnshaw (rearnsha@arm.com) as we know the type. Remove now unnecessary set of orig_type for conversions. -Wed Mar 24 23:27:25 1999 Mark Elbrecht <snowball3@usa.net. +Wed Mar 24 23:27:25 1999 Mark Elbrecht <snowball3@usa.net> + Jeff Law <law@cygnus.com> + + * system.h (STDIN_FILENO): Provide default definition if one is not + provided by the system header files. + (STDOUT_FILENO, STDERR_FILENO): Likewise. + + * i386/xm-djgpp.h (COLLECT2_HOST_INITIALIZATION): New macro. + * collect2.c (main): Use it. + (pexecute_pid): New variable. Holds return value from call to pexecute. + (collect2_execute): Rework to use pexecute instead of fork. + (collect2_wait): Use pwait() instead of wait(). * i386/djgpp.h: Fix typo. diff --git a/gcc/collect2.c b/gcc/collect2.c index f7a6bc8..2f31d94 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -225,6 +225,9 @@ struct obstack temporary_obstack; struct obstack permanent_obstack; char * temporary_firstobj; +/* Holds the return value of pexecute. */ +int pexecute_pid; + /* Defined in the automatically-generated underscore.c. */ extern int prepends_underscore; @@ -999,6 +1002,11 @@ main (argc, argv) int first_file; int num_c_args = argc+9; +#if defined (COLLECT2_HOST_INITIALZATION) + /* Perform system dependant initialization, if neccessary. */ + COLLECT2_HOST_INITIALZATION; +#endif + #ifdef HAVE_LC_MESSAGES setlocale (LC_MESSAGES, ""); #endif @@ -1661,7 +1669,7 @@ collect_wait (prog) { int status; - wait (&status); + pwait (pexecute_pid, &status, 0); if (status) { if (WIFSIGNALED (status)) @@ -1695,7 +1703,7 @@ do_wait (prog) } -/* Fork and execute a program, and wait for the reply. */ +/* Execute a program, and wait for the reply. */ void collect_execute (prog, argv, redir) @@ -1703,7 +1711,11 @@ collect_execute (prog, argv, redir) char **argv; char *redir; { - int pid; + char *errmsg_fmt; + char *errmsg_arg; + int redir_handle = -1; + int stdout_save = -1; + int stderr_save = -1; if (vflag || debug) { @@ -1730,24 +1742,41 @@ collect_execute (prog, argv, redir) if (argv[0] == 0) fatal ("cannot find `%s'", prog); - pid = vfork (); - if (pid == -1) - fatal_perror (VFORK_STRING); + if (redir) + { + /* Open response file. */ + redir_handle = open (redir, O_WRONLY | O_TRUNC | O_CREAT); - if (pid == 0) /* child context */ + /* Duplicate the stdout and stderr file handles + so they can be restored later. */ + stdout_save = dup (STDOUT_FILENO); + if (stdout_save == -1) + fatal_perror ("redirecting stdout: %s", redir); + stderr_save = dup (STDERR_FILENO); + if (stderr_save == -1) + fatal_perror ("redirecting stdout: %s", redir); + + /* Redirect stdout & stderr to our response file. */ + dup2 (redir_handle, STDOUT_FILENO); + dup2 (redir_handle, STDERR_FILENO); + } + + pexecute_pid = pexecute (argv[0], argv, argv[0], NULL, + &errmsg_fmt, &errmsg_arg, + (PEXECUTE_FIRST | PEXECUTE_LAST | PEXECUTE_SEARCH)); + + if (redir) { - if (redir) - { - unlink (redir); - if (freopen (redir, "a", stdout) == NULL) - fatal_perror ("freopen stdout %s", redir); - if (freopen (redir, "a", stderr) == NULL) - fatal_perror ("freopen stderr %s", redir); - } + /* Restore stdout and stderr to their previous settings. */ + dup2 (stdout_save, STDOUT_FILENO); + dup2 (stderr_save, STDERR_FILENO); - execvp (argv[0], argv); - fatal_perror ("execvp %s", prog); + /* Close reponse file. */ + close (redir_handle); } + + if (pexecute_pid == -1) + fatal_perror (errmsg_fmt, errmsg_arg); } static void diff --git a/gcc/config/i386/xm-djgpp.h b/gcc/config/i386/xm-djgpp.h index d5fac90..de91855 100644 --- a/gcc/config/i386/xm-djgpp.h +++ b/gcc/config/i386/xm-djgpp.h @@ -34,3 +34,9 @@ Boston, MA 02111-1307, USA. */ #define LIBSTDCXX "-lstdcxx" +/* System dependant initialization for collect2 + to tell system() to act like Unix. */ +#define COLLECT2_HOST_INITIALIZATION \ + do { __system_flags |= (__system_allow_multiple_cmds \ + | __system_emulate_chdir); } while (0) + diff --git a/gcc/system.h b/gcc/system.h index a744760..7d62ed9 100644 --- a/gcc/system.h +++ b/gcc/system.h @@ -477,6 +477,17 @@ extern void abort (); #define O_NOCTTY 0 #endif +/* Define well known filenos if the system does not define them. */ +#ifndef STDIN_FILENO +# define STDIN_FILENO 0 +#endif +#ifndef STDOUT_FILENO +# define STDOUT_FILENO 1 +#endif +#ifndef STDOUT_FILENO +# define STDERR_FILENO 2 +#endif + /* Get libiberty declarations. */ #include "libiberty.h" |