[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
execute, pipe: pass environment variables
From: |
Bruno Haible |
Subject: |
execute, pipe: pass environment variables |
Date: |
Mon, 29 Sep 2008 15:26:42 +0200 |
User-agent: |
KMail/1.5.4 |
This changes execute() and create_pipe_*() so that they pass the environment
'environ' to child processes, like on Unix.
2008-09-29 Bruno Haible <address@hidden>
Propagate effects of putenv/setenv/unsetenv to child processes.
* lib/execute.c (execute): Use spawnvpe instead of spawnvp.
* lib/pipe.c (create_pipe): Likewise.
--- lib/execute.c.orig 2008-09-29 15:24:54.000000000 +0200
+++ lib/execute.c 2008-09-29 15:23:07.000000000 +0200
@@ -161,15 +161,23 @@
&& ((null_stdout && nulloutfd == STDOUT_FILENO)
|| (null_stderr && nulloutfd == STDERR_FILENO)
|| close (nulloutfd) >= 0))))
+ /* Use spawnvpe and pass the environment explicitly. This is needed if
+ the program has modified the environment using putenv() or [un]setenv().
+ On Windows, programs have two environments, one in the "environment
+ block" of the process and managed through SetEnvironmentVariable(), and
+ one inside the process, in the location retrieved by the 'environ'
+ macro. When using spawnvp() without 'e', the child process inherits a
+ copy of the environment block - ignoring the effects of putenv() and
+ [un]setenv(). */
{
- exitcode = spawnvp (P_WAIT, prog_path, prog_argv);
+ exitcode = spawnvpe (P_WAIT, prog_path, prog_argv, environ);
if (exitcode < 0 && errno == ENOEXEC)
{
/* prog is not an native executable. Try to execute it as a
shell script. Note that prepare_spawn() has already prepended
a hidden element "sh.exe" to prog_argv. */
--prog_argv;
- exitcode = spawnvp (P_WAIT, prog_argv[0], prog_argv);
+ exitcode = spawnvpe (P_WAIT, prog_argv[0], prog_argv, environ);
}
}
if (nulloutfd >= 0)
--- lib/pipe.c.orig 2008-09-29 15:24:54.000000000 +0200
+++ lib/pipe.c 2008-09-29 15:22:51.000000000 +0200
@@ -202,15 +202,23 @@
we want in the case of STD*_FILENO) and also orig_stdin,
orig_stdout, orig_stderr (which is not explicitly wanted but
harmless). */
+ /* Use spawnvpe and pass the environment explicitly. This is needed if
+ the program has modified the environment using putenv() or [un]setenv().
+ On Windows, programs have two environments, one in the "environment
+ block" of the process and managed through SetEnvironmentVariable(), and
+ one inside the process, in the location retrieved by the 'environ'
+ macro. When using spawnvp() without 'e', the child process inherits a
+ copy of the environment block - ignoring the effects of putenv() and
+ [un]setenv(). */
{
- child = spawnvp (P_NOWAIT, prog_path, prog_argv);
+ child = spawnvpe (P_NOWAIT, prog_path, prog_argv, environ);
if (child < 0 && errno == ENOEXEC)
{
/* prog is not an native executable. Try to execute it as a
shell script. Note that prepare_spawn() has already prepended
a hidden element "sh.exe" to prog_argv. */
--prog_argv;
- child = spawnvp (P_NOWAIT, prog_argv[0], prog_argv);
+ child = spawnvpe (P_NOWAIT, prog_argv[0], prog_argv, environ);
}
}
if (stdinfd >= 0)
- execute, pipe: pass environment variables,
Bruno Haible <=