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,