From 4fa72bc37210595f5d6276a4e7b776c48de5dcc1 Mon Sep 17 00:00:00 2001 From: Karsten Blees Date: Sun, 15 Jan 2012 00:31:57 +0100 Subject: [PATCH] Win32: factor out environment block creation Signed-off-by: Karsten Blees --- compat/mingw.c | 55 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/compat/mingw.c b/compat/mingw.c index 47dedae7ce..acb3d71e69 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -995,6 +995,36 @@ static char *path_lookup(const char *cmd, char **path, int exe_only) return prog; } +/* + * Create environment block suitable for CreateProcess. + */ +static wchar_t *make_environment_block(char **env) +{ + wchar_t *wenvblk = NULL; + int count = 0; + char **e, **tmpenv; + int size = 0, wenvsz = 0, wenvpos = 0; + + for (e = env; *e; e++) + count++; + + /* environment must be sorted */ + tmpenv = xmalloc(sizeof(*tmpenv) * (count + 1)); + memcpy(tmpenv, env, sizeof(*tmpenv) * (count + 1)); + qsort(tmpenv, count, sizeof(*tmpenv), compareenv); + + /* create environment block from temporary environment */ + for (e = tmpenv; *e; e++) { + 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(tmpenv); + return wenvblk; +} + struct pinfo_t { struct pinfo_t *next; pid_t pid; @@ -1071,29 +1101,8 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env, xutftowcs(wargs, args.buf, 2 * args.len + 1); strbuf_release(&args); - if (env) { - int count = 0; - char **e, **sorted_env; - int size = 0, wenvsz = 0, wenvpos = 0; - - for (e = env; *e; e++) - count++; - - /* environment must be sorted */ - sorted_env = xmalloc(sizeof(*sorted_env) * (count + 1)); - memcpy(sorted_env, env, sizeof(*sorted_env) * (count + 1)); - qsort(sorted_env, count, sizeof(*sorted_env), compareenv); - - /* create environment block from temporary environment */ - for (e = sorted_env; *e; e++) { - 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); - } + if (env) + wenvblk = make_environment_block(env); memset(&pi, 0, sizeof(pi)); ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags, -- 2.11.4.GIT