summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2003-05-08 18:08:57 +0000
committerJoel Brobecker <brobecker@gnat.com>2003-05-08 18:08:57 +0000
commitd90132261ceeaea4a764d62d44a7051456a5147e (patch)
tree1b30aaedac78cb900ec839c47cb9232b2abd69f5
parent3fe1942e9669c82670ec90b6a7638aeaa69fc78b (diff)
downloadgdb-d90132261ceeaea4a764d62d44a7051456a5147e.tar.gz
* fork-child.c (escape_bang_in_quoted_argument): New function.
(fork_inferior): Escape '!' characters in quoted arguments only when needed.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/fork-child.c26
2 files changed, 31 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ffdb907d5b5..ce84ed74d3d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2002-05-08 J. Brobecker <brobecker@gnat.com>
+
+ * fork-child.c (escape_bang_in_quoted_argument): New function.
+ (fork_inferior): Escape '!' characters in quoted arguments
+ only when needed.
+
2003-05-08 J. Brobecker <brobecker@gnat.com>
* dwarf2read.c (set_cu_language): Set the language to "minimal" if
diff --git a/gdb/fork-child.c b/gdb/fork-child.c
index 738898a3eb3..e1d32b06452 100644
--- a/gdb/fork-child.c
+++ b/gdb/fork-child.c
@@ -88,6 +88,29 @@ breakup_args (char *scratch, char **argv)
}
+/* When executing a command under the given shell, return non-zero
+ if the '!' character should be escaped when embedded in a quoted
+ command-line argument. */
+
+static int
+escape_bang_in_quoted_argument (const char *shell_file)
+{
+ const int shell_file_len = strlen (shell_file);
+
+ /* Bang should be escaped only in C Shells. For now, simply check
+ that the shell name ends with 'csh', which covers at least csh
+ and tcsh. This should be good enough for now. */
+
+ if (shell_file_len < 3)
+ return 0;
+
+ if (shell_file[shell_file_len - 3] == 'c'
+ && shell_file[shell_file_len - 2] == 's'
+ && shell_file[shell_file_len - 1] == 'h')
+ return 1;
+
+ return 0;
+}
/* Start an inferior Unix child process and sets inferior_ptid to its pid.
EXEC_FILE is the file to run.
@@ -171,6 +194,7 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env,
char *p;
int need_to_quote;
+ const int escape_bang = escape_bang_in_quoted_argument (shell_file);
strcat (shell_command, "exec ");
@@ -215,7 +239,7 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env,
{
if (*p == '\'')
strcat (shell_command, "'\\''");
- else if (*p == '!')
+ else if (*p == '!' && escape_bang)
strcat (shell_command, "\\!");
else
strncat (shell_command, p, 1);