aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-23 21:24:49 +0000
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-23 21:24:49 +0000
commitc7cce8c0f40c1ff1c0b887222ffb01ba39e0797f (patch)
tree22c06ca665153780f25817897e0ceb0f60166df8
parenta537037b8e9f4ca6e53e947adc156f023f8acff7 (diff)
PR libfortran/62296
* intrinsics/execute_command_line.c (EXEC_INVALIDCOMMAND): New error code. (cmdmsg_values): New error message. (set_cmdstat): Rework runtime error. (execute_command_line): Handle invalid command line error status. * gfortran.dg/execute_command_line_2.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@227105 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/execute_command_line_2.f9014
-rw-r--r--libgfortran/ChangeLog11
-rw-r--r--libgfortran/intrinsics/execute_command_line.c21
4 files changed, 47 insertions, 4 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0d06a933d88..35b7da236d5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-08-23 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR libfortran/62296
+ * gfortran.dg/execute_command_line_2.f90: New test.
+
2015-08-23 Tom de Vries <tom@codesourcery.com>
* gcc.dg/vect/trapv-vect-reduc-4.c: Use vect_no_int_min_max.
diff --git a/gcc/testsuite/gfortran.dg/execute_command_line_2.f90 b/gcc/testsuite/gfortran.dg/execute_command_line_2.f90
new file mode 100644
index 00000000000..5a4e9cc7b82
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/execute_command_line_2.f90
@@ -0,0 +1,14 @@
+! { dg-do run }
+!
+! Check that EXECUTE_COMMAND_LINE handles invalid command lines appropriately
+!
+ integer :: s = 0, c = 0
+ character(len=255) :: msg = ""
+
+ ! This should fail, set CMDSTAT to nonzero value, and an error message
+ ! in CMDMSG.
+ call execute_command_line ("/nosuchfile", exitstat=s, cmdstat=c, cmdmsg=msg)
+ if (c == 0) call abort
+ if (len_trim(msg) == 0) call abort
+
+end
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 2206c7fe35e..9ffaa035b60 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,7 +1,16 @@
+2015-08-23 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR libfortran/62296
+ * intrinsics/execute_command_line.c (EXEC_INVALIDCOMMAND): New
+ error code.
+ (cmdmsg_values): New error message.
+ (set_cmdstat): Rework runtime error.
+ (execute_command_line): Handle invalid command line error status.
+
2015-08-10 Steven G. Kargl <kargl@gcc.gnu.org>
PR libfortran/67140
- * intrinsics/mvbits.c: Fix build for paltforms without c_int128_t.
+ * intrinsics/mvbits.c: Fix build for platforms without c_int128_t.
2015-08-10 Steven G. Kargl <kargl@gcc.gnu.org>
diff --git a/libgfortran/intrinsics/execute_command_line.c b/libgfortran/intrinsics/execute_command_line.c
index 404314b0952..5af9efd7946 100644
--- a/libgfortran/intrinsics/execute_command_line.c
+++ b/libgfortran/intrinsics/execute_command_line.c
@@ -36,11 +36,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
enum { EXEC_SYNCHRONOUS = -2, EXEC_NOERROR = 0, EXEC_SYSTEMFAILED,
- EXEC_CHILDFAILED };
+ EXEC_CHILDFAILED, EXEC_INVALIDCOMMAND };
static const char *cmdmsg_values[] =
{ "",
"Termination status of the command-language interpreter cannot be obtained",
- "Execution of child process impossible" };
+ "Execution of child process impossible",
+ "Invalid command line" };
@@ -50,7 +51,12 @@ set_cmdstat (int *cmdstat, int value)
if (cmdstat)
*cmdstat = value;
else if (value > EXEC_NOERROR)
- runtime_error ("Could not execute command line");
+ {
+#define MSGLEN 200
+ char msg[MSGLEN] = "EXECUTE_COMMAND_LINE: ";
+ strncat (msg, cmdmsg_values[value], MSGLEN - strlen(msg) - 1);
+ runtime_error (msg);
+ }
}
@@ -95,6 +101,15 @@ execute_command_line (const char *command, bool wait, int *exitstat,
else if (!wait)
set_cmdstat (cmdstat, EXEC_SYNCHRONOUS);
#endif
+ else if (res == 127 || res == 126
+#if defined(WEXITSTATUS) && defined(WIFEXITED)
+ || (WIFEXITED(res) && WEXITSTATUS(res) == 127)
+ || (WIFEXITED(res) && WEXITSTATUS(res) == 126)
+#endif
+ )
+ /* Shell return codes 126 and 127 mean that the command line could
+ not be executed for various reasons. */
+ set_cmdstat (cmdstat, EXEC_INVALIDCOMMAND);
else
set_cmdstat (cmdstat, EXEC_NOERROR);