summaryrefslogtreecommitdiff
path: root/nt
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2015-03-03 14:37:43 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2015-03-03 14:37:43 -0800
commite2ae1c5a40e2802fcd9f5ee26b4906be97c8b878 (patch)
treeb2d56b00e2ae8ba90167ede434561d4a3b1f273d /nt
parentd8462361f2d087d6f7c745305c61a266843ee19c (diff)
parent4b0b27d0018f040bda6a2ec885fa54c666d9c083 (diff)
downloademacs-e2ae1c5a40e2802fcd9f5ee26b4906be97c8b878.tar.gz
Merge from origin/emacs-24
4b0b27d Fix invocation of commands whose file name includes extension 87fc99f Better support for the case of typing RET on the prompt in comint. a7b1c2f Don't lose frame's background color when setting foreground 20c817d Fix handling of frame color parameters in TTY sessions eca7da1 Complete the remaining documentation updates for 24.5 Conflicts: doc/lispref/ChangeLog etc/NEWS lisp/ChangeLog nt/ChangeLog src/ChangeLog
Diffstat (limited to 'nt')
-rw-r--r--nt/ChangeLog10
-rw-r--r--nt/cmdproxy.c72
2 files changed, 76 insertions, 6 deletions
diff --git a/nt/ChangeLog b/nt/ChangeLog
index 240f58c850b..cc77b18adba 100644
--- a/nt/ChangeLog
+++ b/nt/ChangeLog
@@ -1,3 +1,13 @@
+2015-03-03 Eli Zaretskii <eliz@gnu.org>
+
+ * cmdproxy.c (get_next_token): Don't make backslashes disappear
+ without a trace when they are not followed by a quote.
+ (search_dir): Support searching programs whose file name already
+ has an arbitrary extension. (Bug#19817)
+ (main): When passing a command line to the shell, use cmd.exe
+ rules for quoting command-line tail.
+
+2015-03-03 Oscar Fuentes <ofv@wanadoo.es>
2015-02-27 Mark Laws <mdl@60hz.org>
Support daemon mode on MS-Windows (bug#19688)
diff --git a/nt/cmdproxy.c b/nt/cmdproxy.c
index faef2f83496..3157a69c1b6 100644
--- a/nt/cmdproxy.c
+++ b/nt/cmdproxy.c
@@ -135,7 +135,10 @@ skip_nonspace (const char *str)
return str;
}
-int escape_char = '\\';
+/* This value is never changed by the code. We keep the code that
+ supports also the value of '"', but let's allow the compiler to
+ optimize it out, until someone actually uses that. */
+const int escape_char = '\\';
/* Get next token from input, advancing pointer. */
int
@@ -196,11 +199,31 @@ get_next_token (char * buf, const char ** pSrc)
/* End of string, but no ending quote found. We might want to
flag this as an error, but for now will consider the end as
the end of the token. */
+ if (escape_char == '\\')
+ {
+ /* Output literal backslashes. Note that if the
+ token ends with an unpaired backslash, we eat it
+ up here. But since this case invokes undefined
+ behavior anyway, it's okay. */
+ while (escape_char_run > 1)
+ {
+ *o++ = escape_char;
+ escape_char_run -= 2;
+ }
+ }
*o = '\0';
break;
}
else
{
+ if (escape_char == '\\')
+ {
+ /* Output literal backslashes. Note that we don't
+ treat a backslash as an escape character here,
+ since it doesn't preceed a quote. */
+ for ( ; escape_char_run > 0; escape_char_run--)
+ *o++ = escape_char;
+ }
*o++ = *p++;
}
}
@@ -251,13 +274,44 @@ search_dir (const char *dir, const char *exec, int bufsize, char *buffer)
int n_exts = sizeof (exts) / sizeof (char *);
char *dummy;
int i, rc;
+ const char *pext = strrchr (exec, '\\');
+
+ /* Does EXEC already include an extension? */
+ if (!pext)
+ pext = exec;
+ pext = strchr (pext, '.');
/* Search the directory for the program. */
- for (i = 0; i < n_exts; i++)
+ if (pext)
{
- rc = SearchPath (dir, exec, exts[i], bufsize, buffer, &dummy);
+ /* SearchPath will not append an extension if the file already
+ has an extension, so we must append it ourselves. */
+ char exec_ext[MAX_PATH], *p;
+
+ p = strcpy (exec_ext, exec) + strlen (exec);
+
+ /* Search first without any extension; if found, we are done. */
+ rc = SearchPath (dir, exec_ext, NULL, bufsize, buffer, &dummy);
if (rc > 0)
return rc;
+
+ /* Try the known extensions. */
+ for (i = 0; i < n_exts; i++)
+ {
+ strcpy (p, exts[i]);
+ rc = SearchPath (dir, exec_ext, NULL, bufsize, buffer, &dummy);
+ if (rc > 0)
+ return rc;
+ }
+ }
+ else
+ {
+ for (i = 0; i < n_exts; i++)
+ {
+ rc = SearchPath (dir, exec, exts[i], bufsize, buffer, &dummy);
+ if (rc > 0)
+ return rc;
+ }
}
return 0;
@@ -798,7 +852,7 @@ main (int argc, char ** argv)
quotes, since they are illegal in path names). */
remlen = maxlen =
- strlen (progname) + extra_arg_space + strlen (cmdline) + 16;
+ strlen (progname) + extra_arg_space + strlen (cmdline) + 16 + 2;
buf = p = alloca (maxlen + 1);
/* Quote progname in case it contains spaces. */
@@ -813,10 +867,16 @@ main (int argc, char ** argv)
remlen = maxlen - (p - buf);
}
+ /* Now that we know we will be invoking the shell, quote the
+ command line after the "/c" switch as the shell expects:
+ a single pair of quotes enclosing the entire command
+ tail, no matter whether quotes are used in the command
+ line, and how many of them are there. See the output of
+ "cmd /?" for how cmd.exe treats quotes. */
if (run_command_dot_com)
- _snprintf (p, remlen, " /e:%d /c %s", envsize, cmdline);
+ _snprintf (p, remlen, " /e:%d /c \"%s\"", envsize, cmdline);
else
- _snprintf (p, remlen, " /c %s", cmdline);
+ _snprintf (p, remlen, " /c \"%s\"", cmdline);
cmdline = buf;
}
else