Win32: factor out environment block creation
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>
Karsten Blees committed
Jul 17, 2014 at 17:38 UTC
df0e998c31a6d91b905b1ad5b3ff89435ba29313
1 file changed
+32
-23
compat/mingw.c
+32
-23
@@ -906,6 +906,36 @@ static int compareenv(const void *a, const void *b)
906
return strcasecmp(*ea, *eb);
907
}
908
909
+/*
910
+ * Create environment block suitable for CreateProcess.
911
+ */
912
+static wchar_t *make_environment_block(char **env)
913
+{
914
+ wchar_t *wenvblk = NULL;
915
+ int count = 0;
916
+ char **e, **tmpenv;
917
+ int size = 0, wenvsz = 0, wenvpos = 0;
918
+
919
+ for (e = env; *e; e++)
920
+ count++;
921
+
922
+ /* environment must be sorted */
923
+ tmpenv = xmalloc(sizeof(*tmpenv) * (count + 1));
924
+ memcpy(tmpenv, env, sizeof(*tmpenv) * (count + 1));
925
+ qsort(tmpenv, count, sizeof(*tmpenv), compareenv);
926
+
927
+ /* create environment block from temporary environment */
928
+ for (e = tmpenv; *e; e++) {
929
+ size = 2 * strlen(*e) + 2; /* +2 for final \0 */
930
+ ALLOC_GROW(wenvblk, (wenvpos + size) * sizeof(wchar_t), wenvsz);
931
+ wenvpos += xutftowcs(&wenvblk[wenvpos], *e, size) + 1;
932
+ }
933
+ /* add final \0 terminator */
934
+ wenvblk[wenvpos] = 0;
935
+ free(tmpenv);
936
+ return wenvblk;
937
+}
938
+
939
struct pinfo_t {
940
struct pinfo_t *next;
941
pid_t pid;
@@ -982,29 +1012,8 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
1012
xutftowcs(wargs, args.buf, 2 * args.len + 1);
1013
strbuf_release(&args);
1014
985
- if (env) {
986
- int count = 0;
987
- char **e, **sorted_env;
988
- int size = 0, wenvsz = 0, wenvpos = 0;
989
-
990
- for (e = env; *e; e++)
991
- count++;
992
-
993
- /* environment must be sorted */
994
- sorted_env = xmalloc(sizeof(*sorted_env) * (count + 1));
995
- memcpy(sorted_env, env, sizeof(*sorted_env) * (count + 1));
996
- qsort(sorted_env, count, sizeof(*sorted_env), compareenv);
997
-
998
- /* create environment block from temporary environment */
999
- for (e = sorted_env; *e; e++) {
1000
- size = 2 * strlen(*e) + 2; /* +2 for final \0 */
1001
- ALLOC_GROW(wenvblk, (wenvpos + size) * sizeof(wchar_t), wenvsz);
1002
- wenvpos += xutftowcs(&wenvblk[wenvpos], *e, size) + 1;
1003
- }
1004
- /* add final \0 terminator */
1005
- wenvblk[wenvpos] = 0;
1006
- free(sorted_env);
1007
- }
1015
+ if (env)
1016
+ wenvblk = make_environment_block(env);
1017
1018
memset(&pi, 0, sizeof(pi));
1019
ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags,