diff options
author | Tobias Burnus <burnus@net-b.de> | 2011-05-14 08:35:18 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2011-05-14 08:35:18 +0200 |
commit | b4224aec547b9e01f0b79d65c31c7b6da998b8cd (patch) | |
tree | 81bdaf969181cf13f0189259f9ec948ad548a711 /libgfortran/intrinsics | |
parent | 2d9d4585c67d8e6f6e5ea0beffa85871999dbbb3 (diff) | |
download | gcc-b4224aec547b9e01f0b79d65c31c7b6da998b8cd.tar.gz |
re PR libfortran/48961 (EXECUTE_COMMAND_LINE(WAIT=.false.) fails on MinGW)
2011-05-14 Tobias Burnus <burnus@net-b.de>
PR fortran/48961
* intrinsics/execute_command_line.c (set_cmdstat): Don't abort if
synchronously executing with WAIT=.false.
(execute_command_line): Fix setting of cmdstat and exitstat.
From-SVN: r173748
Diffstat (limited to 'libgfortran/intrinsics')
-rw-r--r-- | libgfortran/intrinsics/execute_command_line.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/libgfortran/intrinsics/execute_command_line.c b/libgfortran/intrinsics/execute_command_line.c index 4e3c4451d62..d0b79a45a52 100644 --- a/libgfortran/intrinsics/execute_command_line.c +++ b/libgfortran/intrinsics/execute_command_line.c @@ -38,9 +38,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #endif -enum { EXEC_NOERROR = 0, EXEC_SYSTEMFAILED }; +enum { EXEC_SYNCHRONOUS = -2, EXEC_NOERROR = 0, EXEC_SYSTEMFAILED, + EXEC_CHILDFAILED }; static const char *cmdmsg_values[] = - { "", "Execution of child process impossible" }; + { "", + "Termination status of the command-language interpreter cannot be obtained", + "Execution of child process impossible" }; @@ -49,7 +52,7 @@ set_cmdstat (int *cmdstat, int value) { if (cmdstat) *cmdstat = value; - else if (value != 0) + else if (value > EXEC_NOERROR) runtime_error ("Could not execute command line"); } @@ -74,10 +77,10 @@ execute_command_line (const char *command, bool wait, int *exitstat, /* Asynchronous execution. */ pid_t pid; - set_cmdstat (cmdstat, 0); + set_cmdstat (cmdstat, EXEC_NOERROR); if ((pid = fork()) < 0) - set_cmdstat (cmdstat, EXEC_SYSTEMFAILED); + set_cmdstat (cmdstat, EXEC_CHILDFAILED); else if (pid == 0) { /* Child process. */ @@ -91,13 +94,15 @@ execute_command_line (const char *command, bool wait, int *exitstat, /* Synchronous execution. */ int res = system (cmd); - if (!wait) - set_cmdstat (cmdstat, -2); - else if (res == -1) + if (res == -1) set_cmdstat (cmdstat, EXEC_SYSTEMFAILED); + else if (!wait) + set_cmdstat (cmdstat, EXEC_SYNCHRONOUS); else + set_cmdstat (cmdstat, EXEC_NOERROR); + + if (res != -1) { - set_cmdstat (cmdstat, 0); #if defined(WEXITSTATUS) && defined(WIFEXITED) *exitstat = WIFEXITED(res) ? WEXITSTATUS(res) : res; #else @@ -107,7 +112,7 @@ execute_command_line (const char *command, bool wait, int *exitstat, } /* Now copy back to the Fortran string if needed. */ - if (cmdstat && *cmdstat > 0) + if (cmdstat && *cmdstat > EXEC_NOERROR) { if (cmdmsg) fstrcpy (cmdmsg, cmdmsg_len, cmdmsg_values[*cmdstat], |