diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 4370ffb16..6d5258e32 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +Sun Jul 16 02:30:09 2000 Christopher Faylor + + * spawn.cc (spawn_guts): Use \ for quoting '"'. + * dcrt0.cc (quoted): Understand \ quoting for '"'. + Sun Jul 16 00:32:58 2000 Christopher Faylor * dcrt0.cc (build_argv): Strip quotes from argv[0] since it should diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 2d3fa8f7b..e33187acf 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -277,7 +277,7 @@ isquote (char c) } /* Step over a run of characters delimited by quotes */ -static __inline char * +static /*__inline*/ char * quoted (char *cmd, int winshell) { char *p; @@ -293,10 +293,10 @@ quoted (char *cmd, int winshell) cmd = strchr (cmd, '\0'); // no closing quote break; } - else if (p[1] == quote) + else if (p[1] == quote && p[-1] != '\\') { - *p++ = '\\'; - cmd = p; // a quoted quote + *p = '\\'; + cmd = ++p; // a quoted quote } else { @@ -310,20 +310,26 @@ quoted (char *cmd, int winshell) characters should have been placed here by spawn_guts, so we'll just pinch them out of the command string unless they're quoted with a preceding \ */ - strcpy (cmd, cmd + 1); - while (*cmd) + p = cmd + 1; + while (*p) { - if (*cmd != quote) - cmd++; - else if (cmd[1] == quote) - strcpy (cmd++, cmd + 1); + if (*p != quote) + p++; + else if (p[-1] == '\\') + strcpy (p - 1, p); + else if (p[1] == quote) + { + strcpy (p, p + 1); + p++; + } else { - strcpy (cmd, cmd + 1); + strcpy (p, p + 1); break; } } - return cmd; + strcpy (cmd, cmd + 1); + return p - 1; } /* Perform a glob on word if it contains wildcard characters. diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 6ca82e413..af284f8ee 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -407,16 +407,17 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv, newargv0 = NULL; int len = strlen (a); - if (len != 0 && !(p = strpbrk (a, " \t\n\r\""))) + if (len != 0 && !strpbrk (a, " \t\n\r\"")) one_line.add (a, len); else { one_line.add ("\"", 1); - for (; p; a = p, p = strchr (p, '"')) + for (0; p = strpbrk (a, "\"\\"); a = ++p) { - one_line.add (a, ++p - a); - if (p[-1] == '"') - one_line.add ("\"", 1); + one_line.add (a, p - a); + if (*p == '\\' || *p == '"') + one_line.add ("\\", 1); + one_line.add (p, 1); } if (*a) one_line.add (a);