start_command: do not clobber cmd->env on Windows code path

Previously, it would not be possible to call start_command twice for the
same struct child_process that has env set.

The fix is achieved by moving the loop that modifies the environment block
into a helper function. This also allows us to make two other helper
functions static.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Sixt 2009-09-11 19:40:08 +02:00 коммит произвёл Junio C Hamano
Родитель 434a6db7dc
Коммит 2affea4125
3 изменённых файлов: 17 добавлений и 9 удалений

Просмотреть файл

@ -824,7 +824,7 @@ void mingw_execvp(const char *cmd, char *const *argv)
free_path_split(path);
}
char **copy_environ()
static char **copy_environ(void)
{
char **env;
int i = 0;
@ -861,7 +861,7 @@ static int lookup_env(char **env, const char *name, size_t nmln)
/*
* If name contains '=', then sets the variable, otherwise it unsets it
*/
char **env_setenv(char **env, const char *name)
static char **env_setenv(char **env, const char *name)
{
char *eq = strchrnul(name, '=');
int i = lookup_env(env, name, eq-name);
@ -886,6 +886,18 @@ char **env_setenv(char **env, const char *name)
return env;
}
/*
* Copies global environ and adjusts variables as specified by vars.
*/
char **make_augmented_environ(const char *const *vars)
{
char **env = copy_environ();
while (*vars)
env = env_setenv(env, *vars++);
return env;
}
/* this is the first function to call into WS_32; initialize it */
#undef gethostbyname
struct hostent *mingw_gethostbyname(const char *host)

Просмотреть файл

@ -222,9 +222,8 @@ void mingw_open_html(const char *path);
* helpers
*/
char **copy_environ(void);
char **make_augmented_environ(const char *const *vars);
void free_environ(char **env);
char **env_setenv(char **env, const char *name);
/*
* A replacement of main() that ensures that argv[0] has a path

Просмотреть файл

@ -173,11 +173,8 @@ fail_pipe:
if (cmd->dir)
die("chdir in start_command() not implemented");
if (cmd->env) {
env = copy_environ();
for (; *cmd->env; cmd->env++)
env = env_setenv(env, *cmd->env);
}
if (cmd->env)
env = make_augmented_environ(cmd->env);
if (cmd->git_cmd) {
cmd->argv = prepare_git_cmd(cmd->argv);