On Sun, Feb 17, 2013 at 1:59 PM, John W. Eaton <j...@octave.org> wrote:

> On 02/15/2013 03:16 PM, Michael Goffioul wrote:
>
>> On Fri, Feb 15, 2013 at 2:10 PM, Paul Eggert <egg...@cs.ucla.edu
>> <mailto:egg...@cs.ucla.edu>> wrote:
>>
>>     On 02/15/2013 07:10 AM, Michael Goffioul wrote:
>>      > I guess the only solution to this problem is to always _putenv
>>     and not manipulate "environ" directly.
>>
>>     Thanks, is that something you can write and contribute
>>     to the GNU project?  This sort of thing really requires
>>     Microsoft expertise, which I don't have.
>>
>>
>> I can give it a try, but not before a couple of days. Also to avoid
>> breaking things, what is the putenv module supposed to solve? From what
>> I understand, it is:
>> - make putenv("VARNAME") remove VARNAME from the environment
>> - make putenv("VARNAME=") create and empty environment variable
>> Is there anything else?
>>
>> Reading the specs here [1], I don't think the bit: "In either case, the
>> string pointed to by /string/ shall become part of the environment, so
>>
>> altering the string shall change the environment." is actually possible.
>> I believe _putenv ultimately calls SetEnvironmentVariable [2] and
>> nothing there says that altering the given string will effectively alter
>> the environment.
>>
>> Michael.
>>
>> [1] http://pubs.opengroup.org/**onlinepubs/9699919799/**
>> functions/putenv.html<http://pubs.opengroup.org/onlinepubs/9699919799/functions/putenv.html>
>> [2]
>> http://msdn.microsoft.com/en-**us/library/windows/desktop/**
>> ms686206(v=vs.85).aspx<http://msdn.microsoft.com/en-us/library/windows/desktop/ms686206(v=vs.85).aspx>
>>
>
> How about something like the attached patch?  The program I used for
> testing (modified from Michael's, and with the modified putenv function
> included) is also attached.
>
> I'm not sure I like the way I've nested the conditionals, or if it is even
> the right thing to do.  Maybe it would be better to leave the original code
> as it was and just have a separate version for Windows systems that uses
> _putenv and SetEnvironmentVariable.  I'm willing to rework this as
> necessary.
>

THe situation is a bit messy, because of the manipulation of the
environment at 2 different levels (C runtime and Win32). You have _putenv,
environ and SetEnvironmentVariable. _putenv will update environ and call
SetEnvironmentVariable. Manipulating environ has no effect at Win32 level.
And I believe SetEnvironmentVariable will not update environ.

When putting everything together, I think the best trade-off is to use
always _putenv, and covering the cases of putenv("VAR") and putenv("VAR=")
(if possible).


>
> In any case, I think it is important to fix putenv so that we not have to
> do some tricks at the time of subprocess creation in order for the
> environment to be passed to subprocesses.  Relying on that is likely to
> lead to unexpected results and problems that are hard to debug.  I think it
> is unreasonable to expect that we can control the way all subprocesses are
> created.


Agreed.

Michael.

Reply via email to