From 104ea5f96d87b2f954e1744c1014a04fff30f8cd Mon Sep 17 00:00:00 2001 From: Karsten Blees Date: Mon, 16 Jan 2012 00:07:46 +0100 Subject: [PATCH] Win32: Unicode environment (outgoing) Convert environment from UTF-8 to UTF-16 when creating other processes. Signed-off-by: Karsten Blees --- compat/mingw.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/compat/mingw.c b/compat/mingw.c index ab5216feb8..7e82b519ae 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -957,9 +957,9 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env, { STARTUPINFOW si; PROCESS_INFORMATION pi; - struct strbuf envblk, args; - wchar_t wcmd[MAX_PATH], wdir[MAX_PATH], *wargs; - unsigned flags; + struct strbuf args; + wchar_t wcmd[MAX_PATH], wdir[MAX_PATH], *wargs, *wenvblk = NULL; + unsigned flags = CREATE_UNICODE_ENVIRONMENT; BOOL ret; /* Determine whether or not we are associated to a console */ @@ -976,7 +976,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env, * instead of CREATE_NO_WINDOW to make ssh * recognize that it has no console. */ - flags = DETACHED_PROCESS; + flags |= DETACHED_PROCESS; } else { /* There is already a console. If we specified * DETACHED_PROCESS here, too, Windows would @@ -984,7 +984,6 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env, * The same is true for CREATE_NO_WINDOW. * Go figure! */ - flags = 0; CloseHandle(cons); } memset(&si, 0, sizeof(si)); @@ -1023,6 +1022,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env, if (env) { int count = 0; char **e, **sorted_env; + int size = 0, wenvsz = 0, wenvpos = 0; for (e = env; *e; e++) count++; @@ -1032,20 +1032,22 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env, memcpy(sorted_env, env, sizeof(*sorted_env) * (count + 1)); qsort(sorted_env, count, sizeof(*sorted_env), env_compare); - strbuf_init(&envblk, 0); + /* create environment block from temporary environment */ for (e = sorted_env; *e; e++) { - strbuf_addstr(&envblk, *e); - strbuf_addch(&envblk, '\0'); + size = 2 * strlen(*e) + 2; /* +2 for final \0 */ + ALLOC_GROW(wenvblk, (wenvpos + size) * sizeof(wchar_t), wenvsz); + wenvpos += xutftowcs(&wenvblk[wenvpos], *e, size) + 1; } + /* add final \0 terminator */ + wenvblk[wenvpos] = 0; free(sorted_env); } memset(&pi, 0, sizeof(pi)); ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags, - env ? envblk.buf : NULL, dir ? wdir : NULL, &si, &pi); + wenvblk, dir ? wdir : NULL, &si, &pi); - if (env) - strbuf_release(&envblk); + free(wenvblk); free(wargs); if (!ret) { -- 2.11.4.GIT