Win32: Unicode arguments (outgoing)
Convert command line arguments from UTF-8 to UTF-16 when creating other processes. Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Stepan Kasal <kasal@ucw.cz> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
5901dc6613
commit
99c3c76d97
@ -831,9 +831,10 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
|
|||||||
const char *dir,
|
const char *dir,
|
||||||
int prepend_cmd, int fhin, int fhout, int fherr)
|
int prepend_cmd, int fhin, int fhout, int fherr)
|
||||||
{
|
{
|
||||||
STARTUPINFO si;
|
STARTUPINFOW si;
|
||||||
PROCESS_INFORMATION pi;
|
PROCESS_INFORMATION pi;
|
||||||
struct strbuf envblk, args;
|
struct strbuf envblk, args;
|
||||||
|
wchar_t wcmd[MAX_PATH], wdir[MAX_PATH], *wargs;
|
||||||
unsigned flags;
|
unsigned flags;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
|
|
||||||
@ -869,6 +870,11 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
|
|||||||
si.hStdOutput = winansi_get_osfhandle(fhout);
|
si.hStdOutput = winansi_get_osfhandle(fhout);
|
||||||
si.hStdError = winansi_get_osfhandle(fherr);
|
si.hStdError = winansi_get_osfhandle(fherr);
|
||||||
|
|
||||||
|
if (xutftowcs_path(wcmd, cmd) < 0)
|
||||||
|
return -1;
|
||||||
|
if (dir && xutftowcs_path(wdir, dir) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
/* concatenate argv, quoting args as we go */
|
/* concatenate argv, quoting args as we go */
|
||||||
strbuf_init(&args, 0);
|
strbuf_init(&args, 0);
|
||||||
if (prepend_cmd) {
|
if (prepend_cmd) {
|
||||||
@ -886,6 +892,10 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
|
|||||||
free(quoted);
|
free(quoted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wargs = xmalloc((2 * args.len + 1) * sizeof(wchar_t));
|
||||||
|
xutftowcs(wargs, args.buf, 2 * args.len + 1);
|
||||||
|
strbuf_release(&args);
|
||||||
|
|
||||||
if (env) {
|
if (env) {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
char **e, **sorted_env;
|
char **e, **sorted_env;
|
||||||
@ -907,12 +917,12 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
|
|||||||
}
|
}
|
||||||
|
|
||||||
memset(&pi, 0, sizeof(pi));
|
memset(&pi, 0, sizeof(pi));
|
||||||
ret = CreateProcess(cmd, args.buf, NULL, NULL, TRUE, flags,
|
ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags,
|
||||||
env ? envblk.buf : NULL, dir, &si, &pi);
|
env ? envblk.buf : NULL, dir ? wdir : NULL, &si, &pi);
|
||||||
|
|
||||||
if (env)
|
if (env)
|
||||||
strbuf_release(&envblk);
|
strbuf_release(&envblk);
|
||||||
strbuf_release(&args);
|
free(wargs);
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
|
Loading…
Reference in New Issue
Block a user