From b4224aec547b9e01f0b79d65c31c7b6da998b8cd Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Sat, 14 May 2011 08:35:18 +0200 Subject: [PATCH] re PR libfortran/48961 (EXECUTE_COMMAND_LINE(WAIT=.false.) fails on MinGW) 2011-05-14 Tobias Burnus 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 --- libgfortran/ChangeLog | 7 ++++++ libgfortran/intrinsics/execute_command_line.c | 25 +++++++++++-------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index e40450087de..ab952172f76 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2011-05-14 Tobias Burnus + + 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. + 2011-05-06 Tobias Burnus PR fortran/18918 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], -- 2.30.2