diff options
author | Bram Moolenaar <Bram@vim.org> | 2012-02-22 13:07:05 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2012-02-22 13:07:05 +0100 |
commit | fb7df7be2f7c80428a3379010ca701689c85aa12 (patch) | |
tree | 9d098e24a6ea9172e1d6e20c57304e5957ea22ad /src/os_win32.c | |
parent | 6b707b4b82efe41e937076bce554812a8cd0e8dc (diff) | |
download | vim-fb7df7be2f7c80428a3379010ca701689c85aa12.zip |
updated for version 7.3.448
Problem: Win32: Still a problem with "!start /b".
Solution: Escape only '|'. (Yasuhiro Matsumoto)
Diffstat (limited to 'src/os_win32.c')
-rw-r--r-- | src/os_win32.c | 55 |
1 files changed, 42 insertions, 13 deletions
diff --git a/src/os_win32.c b/src/os_win32.c index bab7d1e70..2f764d3dc 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -3933,7 +3933,9 @@ mch_call_shell( else { /* we use "command" or "cmd" to start the shell; slow but easy */ - char_u *cmdbase = cmd; + char_u *newcmd = NULL; + char_u *cmdbase = cmd; + long_u cmdlen; /* Skip a leading ", ( and "(. */ if (*cmdbase == '"' ) @@ -3971,12 +3973,12 @@ mch_call_shell( flags = CREATE_NO_WINDOW; si.dwFlags = STARTF_USESTDHANDLES; si.hStdInput = CreateFile("\\\\.\\NUL", // File name - GENERIC_READ, // Access flags + GENERIC_READ, // Access flags 0, // Share flags - NULL, // Security att. - OPEN_EXISTING, // Open flags - FILE_ATTRIBUTE_NORMAL, // File att. - NULL); // Temp file + NULL, // Security att. + OPEN_EXISTING, // Open flags + FILE_ATTRIBUTE_NORMAL, // File att. + NULL); // Temp file si.hStdOutput = si.hStdInput; si.hStdError = si.hStdInput; } @@ -3993,12 +3995,36 @@ mch_call_shell( *--p = NUL; } + newcmd = cmdbase; + unescape_shellxquote(cmdbase, p_sxe); + /* - * Unescape characters in shellxescape. This is workaround for - * /b option. Only redirect character should be unescaped. + * If creating new console, arguments are passed to the + * 'cmd.exe' as-is. If it's not, arguments are not treated + * correctly for current 'cmd.exe'. So unescape characters in + * shellxescape except '|' for avoiding to be treated as + * argument to them. Pass the arguments to sub-shell. */ - unescape_shellxquote(cmdbase, - (flags & CREATE_NEW_CONSOLE) ? p_sxe : "<>"); + if (flags != CREATE_NEW_CONSOLE) + { + char_u *subcmd; + char_u *cmd_shell = default_shell(); + + subcmd = vim_strsave_escaped_ext(cmdbase, "|", '^', FALSE); + if (subcmd != NULL) + { + /* make "cmd.exe /c arguments" */ + cmdlen = STRLEN(cmd_shell) + STRLEN(subcmd) + 5; + vim_free(subcmd); + + newcmd = lalloc(cmdlen, TRUE); + if (newcmd != NULL) + vim_snprintf((char *)newcmd, cmdlen, "%s /c %s", + default_shell, subcmd); + else + newcmd = cmdbase; + } + } /* * Now, start the command as a process, so that it doesn't @@ -4006,7 +4032,7 @@ mch_call_shell( * files if we exit before the spawned process */ if (CreateProcess(NULL, // Executable name - cmdbase, // Command to execute + newcmd, // Command to execute NULL, // Process security attributes NULL, // Thread security attributes FALSE, // Inherit handles @@ -4023,6 +4049,10 @@ mch_call_shell( EMSG(_("E371: Command not found")); #endif } + + if (newcmd != cmdbase) + vim_free(newcmd); + if (si.hStdInput != NULL) { /* Close the handle to \\.\NUL */ @@ -4034,8 +4064,7 @@ mch_call_shell( } else { - char_u *newcmd; - long_u cmdlen = ( + cmdlen = ( #ifdef FEAT_GUI_W32 (allowPiping && !p_stmp ? 0 : STRLEN(vimrun_path)) + #endif |