* bug#10980: GNU bugs information: logs for bug#10980
[not found] ` <handler.s.R.14653322689344.info.0@debbugs.gnu.org>
@ 2016-06-08 3:54 ` Noam Postavsky
2016-06-08 16:40 ` Eli Zaretskii
0 siblings, 1 reply; 15+ messages in thread
From: Noam Postavsky @ 2016-06-08 3:54 UTC (permalink / raw)
To: 10980; +Cc: bo.johansson
severity 10980 wishlist
quit
> From: "Bo Johansson" <bo.johansson <at> lsn.se>
> To: "Eli Zaretskii" <eliz <at> gnu.org>
> Cc: 10980 <at> debbugs.gnu.org
> Subject: Re: bug#10980: 23.4; Variable initial-environment incorrectly set
> Date: Wed, 28 Mar 2012 10:56:44 +0200
>
> My idea to get a read-only "inherited environment" is:
> 1) To save the "inherited environment" early in "c-code" at start up of
> Emacs
> 2) Implement a lisp function which can return the saved "inherited
> environment".
>
> The new read-only "inherited environment" can then later be used to start
> external processes with a more "transparent" environment.
> To start to change the current handling of the variable initial-environment
> is probably difficult and error prone.
>
I read this as a feature request to let lisp programs be able to see
the environment from before Emacs startup routines have changed it. I
have an additional use case for this: in magit it would be useful to
see if the user has HOME or if they just let Emacs choose a default
value for it. In the latter case, I would pop up a warning to tell
them not to do that because git chooses a different default value
HOME, and having disagreement causes confusion (of the "why does X
work from command line and not in magit?" variety).
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-08 3:54 ` bug#10980: GNU bugs information: logs for bug#10980 Noam Postavsky
@ 2016-06-08 16:40 ` Eli Zaretskii
2016-06-21 0:23 ` Noam Postavsky
0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2016-06-08 16:40 UTC (permalink / raw)
To: Noam Postavsky; +Cc: bo.johansson, 10980
> From: Noam Postavsky <npostavs@users.sourceforge.net>
> Date: Tue, 7 Jun 2016 23:54:17 -0400
> Cc: bo.johansson@lsn.se
>
> > My idea to get a read-only "inherited environment" is:
> > 1) To save the "inherited environment" early in "c-code" at start up of
> > Emacs
> > 2) Implement a lisp function which can return the saved "inherited
> > environment".
> >
> > The new read-only "inherited environment" can then later be used to start
> > external processes with a more "transparent" environment.
> > To start to change the current handling of the variable initial-environment
> > is probably difficult and error prone.
> >
>
> I read this as a feature request to let lisp programs be able to see
> the environment from before Emacs startup routines have changed it.
I don't think we want to have environment-related functions that are
specific to Windows, that goes against the goal of portability of
Emacs packages.
I'm okay with considering patches specific to w32 that would eliminate
the need for pushing variables into the environment of subprocesses,
and/or leave initial-environment unaffected by the pushed values, but
no one has stepped forward for the job.
> I have an additional use case for this: in magit it would be useful
> to see if the user has HOME or if they just let Emacs choose a
> default value for it. In the latter case, I would pop up a warning
> to tell them not to do that because git chooses a different default
> value HOME, and having disagreement causes confusion (of the "why
> does X work from command line and not in magit?" variety).
I guess you refer to the fact that msysgit uses $USERPROFILE as the
alternative home directory if $HOME is not set? If so, I'd rather
suggest to report a bug to msysgit maintainers: they are behaving
against platform recommendations. From
https://msdn.microsoft.com/en-us/library/windows/desktop/bb762494%28v=vs.85%29.aspx:
CSIDL_PROFILE
FOLDERID_Profile
The user's profile folder. A typical path is
C:\Users\username. Applications should not create files or folders
at this level; they should put their data under the locations
referred to by CSIDL_APPDATA or CSIDL_LOCAL_APPDATA. However, if you
are creating a new Known Folder the profile root referred to by
CSIDL_PROFILE is appropriate.
If you look in the $USERPROFILE directory on a typical Windows
machine, you won't see there any sub-directory or file created by an
application, only a few standard sub-directories. Applications do
generally follow the above recommendations; for example, I have
Firefox installed, which keeps my customizations in
$APPDATA/Mozilla/Firefox/Profiles/. So Git is the odd one out if it
puts its ~/.gitconfig file in $USERPROFILE.
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-08 16:40 ` Eli Zaretskii
@ 2016-06-21 0:23 ` Noam Postavsky
2016-06-21 13:27 ` Eli Zaretskii
0 siblings, 1 reply; 15+ messages in thread
From: Noam Postavsky @ 2016-06-21 0:23 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: bo.johansson, 10980
[-- Attachment #1: Type: text/plain, Size: 1606 bytes --]
On Wed, Jun 8, 2016 at 12:40 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> I don't think we want to have environment-related functions that are
> specific to Windows, that goes against the goal of portability of
> Emacs packages.
>
> I'm okay with considering patches specific to w32 that would eliminate
> the need for pushing variables into the environment of subprocesses,
> and/or leave initial-environment unaffected by the pushed values
How about splitting apart initialization of Vinitial_environment and
Vprocess_environment and moving the former earlier so that it's
unaffected by Emacs' manipulations of the environment? See attached
patch.
> I guess you refer to the fact that msysgit uses $USERPROFILE as the
> alternative home directory if $HOME is not set? If so, I'd rather
> suggest to report a bug to msysgit maintainers: they are behaving
> against platform recommendations.
[...]
> If you look in the $USERPROFILE directory on a typical Windows
> machine, you won't see there any sub-directory or file created by an
> application, only a few standard sub-directories. Applications do
> generally follow the above recommendations; for example, I have
> Firefox installed, which keeps my customizations in
> $APPDATA/Mozilla/Firefox/Profiles/. So Git is the odd one out if it
> puts its ~/.gitconfig file in $USERPROFILE.
To me it makes sense to have $HOME map to $USERPROFILE, and $APPDATA
is like $XDG_CONFIG_HOME (usually ~/.config/ on GNU/Linux). However,
this is purely subjective as there are no platform recommendations
about translating environment variables to other platforms.
[-- Attachment #2: 0001-Set-Vinitial_environment-before-changing-env-vars.patch --]
[-- Type: application/octet-stream, Size: 3432 bytes --]
From d67fb15fdcd7a742ce0bb7963ddcfea430f7ef19 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Mon, 20 Jun 2016 20:08:15 -0400
Subject: [PATCH] Set Vinitial_environment before changing env vars
* src/callproc.c (make_list_from_environ): Renamed from
set_initial_environment, just return a Lisp list of the environment
instead of setting of Vprocess_environment and Vinitial_environment
directly.
* src/emacs.c (main): Set Vinitial_environment before init_environment
is called so that it gets the initial environment inherited from the
parent process and remains unaffected by modifications Emacs
performs (Bug #10980).
---
src/callproc.c | 12 +++++-------
src/emacs.c | 14 ++++++++------
src/lisp.h | 2 +-
3 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/src/callproc.c b/src/callproc.c
index 0729782..924b755 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -1577,16 +1577,14 @@ init_callproc (void)
#endif
}
-void
-set_initial_environment (void)
+Lisp_Object
+make_list_from_environ (void)
{
char **envp;
+ Lisp_Object list = Qnil;
for (envp = environ; *envp; envp++)
- Vprocess_environment = Fcons (build_string (*envp),
- Vprocess_environment);
- /* Ideally, the `copy' shouldn't be necessary, but it seems it's frequent
- to use `delete' and friends on process-environment. */
- Vinitial_environment = Fcopy_sequence (Vprocess_environment);
+ list = Fcons (build_string (*envp), list);
+ return list;
}
void
diff --git a/src/emacs.c b/src/emacs.c
index bb85733..1dbb3f6 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -1210,10 +1210,17 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
#ifdef HAVE_WINDOW_SYSTEM
init_fringe_once (); /* Swap bitmaps if necessary. */
#endif /* HAVE_WINDOW_SYSTEM */
+
+ /* Initialize and GC-protect Vinitial_environment and Vprocess_environment
+ before filling them in. */
+ syms_of_callproc ();
}
init_alloc ();
+ if (! dumping)
+ Vinitial_environment = make_list_from_environ ();
+
if (do_initial_setlocale)
{
fixup_locale ();
@@ -1366,16 +1373,11 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
ns_init_locale ();
#endif
- /* Initialize and GC-protect Vinitial_environment and
- Vprocess_environment before set_initial_environment fills them
- in. */
- if (!initialized)
- syms_of_callproc ();
/* egetenv is a pretty low-level facility, which may get called in
many circumstances; it seems flimsy to put off initializing it
until calling init_callproc. Do not do it when dumping. */
if (! dumping)
- set_initial_environment ();
+ Vprocess_environment = make_list_from_environ ();
/* AIX crashes are reported in system versions 3.2.3 and 3.2.4
if this is not done. Do it after set_global_environment so that we
diff --git a/src/lisp.h b/src/lisp.h
index e0eb52a..33e1f70 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4199,7 +4199,7 @@ extern void setup_process_coding_systems (Lisp_Object);
extern int child_setup (int, int, int, char **, bool, Lisp_Object);
extern void init_callproc_1 (void);
extern void init_callproc (void);
-extern void set_initial_environment (void);
+extern Lisp_Object make_list_from_environ (void);
extern void syms_of_callproc (void);
/* Defined in doc.c. */
--
2.6.2.windows.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-21 0:23 ` Noam Postavsky
@ 2016-06-21 13:27 ` Eli Zaretskii
2016-06-21 21:03 ` Noam Postavsky
0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2016-06-21 13:27 UTC (permalink / raw)
To: Noam Postavsky; +Cc: bo.johansson, 10980
> From: Noam Postavsky <npostavs@users.sourceforge.net>
> Date: Mon, 20 Jun 2016 20:23:26 -0400
> Cc: 10980@debbugs.gnu.org, bo.johansson@lsn.se
>
> > I'm okay with considering patches specific to w32 that would eliminate
> > the need for pushing variables into the environment of subprocesses,
> > and/or leave initial-environment unaffected by the pushed values
>
> How about splitting apart initialization of Vinitial_environment and
> Vprocess_environment and moving the former earlier so that it's
> unaffected by Emacs' manipulations of the environment? See attached
> patch.
Thanks. However, I wonder if we could do better. First, your patch
only fixed initial-environment, which means Lisp applications will
need to explicitly use it, and probably only on Windows, something
that is not the best solution, IMO. I hoped we could come up with a
way of pushing the additional variables into Emacs's own environment
after Vprocess_environment is already computed -- can you try doing
that?
In any case, the reasons for calling the same function twice in two
different places should be explained, at least in the comments, or
else someone might become confused at some future point in time.
Better yet, perhaps only the Windows build should do something like
that, and the other platforms could continue using the current code
mostly unaltered, as they don't need this.
> > If you look in the $USERPROFILE directory on a typical Windows
> > machine, you won't see there any sub-directory or file created by an
> > application, only a few standard sub-directories. Applications do
> > generally follow the above recommendations; for example, I have
> > Firefox installed, which keeps my customizations in
> > $APPDATA/Mozilla/Firefox/Profiles/. So Git is the odd one out if it
> > puts its ~/.gitconfig file in $USERPROFILE.
>
> To me it makes sense to have $HOME map to $USERPROFILE, and $APPDATA
> is like $XDG_CONFIG_HOME (usually ~/.config/ on GNU/Linux). However,
> this is purely subjective as there are no platform recommendations
> about translating environment variables to other platforms.
I quoted the platform recommendations that discourage putting files
directly under $USERPROFILE, and most programs, including those ported
from Posix platforms, do seem to follow those recommendations.
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-21 13:27 ` Eli Zaretskii
@ 2016-06-21 21:03 ` Noam Postavsky
2016-06-22 2:39 ` Eli Zaretskii
0 siblings, 1 reply; 15+ messages in thread
From: Noam Postavsky @ 2016-06-21 21:03 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: bo.johansson, 10980
On Tue, Jun 21, 2016 at 9:27 AM, Eli Zaretskii <eliz@gnu.org> wrote:
>> How about splitting apart initialization of Vinitial_environment and
>> Vprocess_environment and moving the former earlier so that it's
>> unaffected by Emacs' manipulations of the environment? See attached
>> patch.
>
> Thanks. However, I wonder if we could do better. First, your patch
> only fixed initial-environment, which means Lisp applications will
> need to explicitly use it, and probably only on Windows,
Well, Lisp applications that want the environment as Emacs originally
received it will use initial-environment regardless of platform
(without the patch, on Windows, they get an environment with some
modifications from Emacs).
> that is not the best solution, IMO. I hoped we could come up with a
> way of pushing the additional variables into Emacs's own environment
> after Vprocess_environment is already computed -- can you try doing
> that?
I feel like I'm missing some important point here. If these
environment variables won't affect subprocess environments, why set
them at all?
>
> In any case, the reasons for calling the same function twice in two
> different places should be explained, at least in the comments, or
> else someone might become confused at some future point in time.
Right.
> Better yet, perhaps only the Windows build should do something like
> that, and the other platforms could continue using the current code
> mostly unaltered, as they don't need this.
Isn't it simpler to do the same thing on all platforms? They don't
need a different approach, but it doesn't hurt either.
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-21 21:03 ` Noam Postavsky
@ 2016-06-22 2:39 ` Eli Zaretskii
2016-06-22 2:54 ` Noam Postavsky
0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2016-06-22 2:39 UTC (permalink / raw)
To: Noam Postavsky; +Cc: bo.johansson, 10980
> From: Noam Postavsky <npostavs@users.sourceforge.net>
> Date: Tue, 21 Jun 2016 17:03:21 -0400
> Cc: 10980@debbugs.gnu.org, bo.johansson@lsn.se
>
> I feel like I'm missing some important point here. If these
> environment variables won't affect subprocess environments, why set
> them at all?
Because Emacs itself needs them. They must be in Emacs's environment,
but don't have to be in Vprocess_environment.
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-22 2:39 ` Eli Zaretskii
@ 2016-06-22 2:54 ` Noam Postavsky
2016-06-22 14:57 ` Eli Zaretskii
0 siblings, 1 reply; 15+ messages in thread
From: Noam Postavsky @ 2016-06-22 2:54 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: bo.johansson, 10980
On Tue, Jun 21, 2016 at 10:39 PM, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Noam Postavsky <npostavs@users.sourceforge.net>
>> Date: Tue, 21 Jun 2016 17:03:21 -0400
>> Cc: 10980@debbugs.gnu.org, bo.johansson@lsn.se
>>
>> I feel like I'm missing some important point here. If these
>> environment variables won't affect subprocess environments, why set
>> them at all?
>
> Because Emacs itself needs them. They must be in Emacs's environment,
> but don't have to be in Vprocess_environment.
What does it need them for? Just because Emacs consults the values
from its environment? Is there some reason not to use just plain old
global variables?
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-22 2:54 ` Noam Postavsky
@ 2016-06-22 14:57 ` Eli Zaretskii
2016-06-29 13:12 ` Noam Postavsky
0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2016-06-22 14:57 UTC (permalink / raw)
To: Noam Postavsky; +Cc: bo.johansson, 10980
> From: Noam Postavsky <npostavs@users.sourceforge.net>
> Date: Tue, 21 Jun 2016 22:54:25 -0400
> Cc: 10980@debbugs.gnu.org, bo.johansson@lsn.se
>
> On Tue, Jun 21, 2016 at 10:39 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> >> From: Noam Postavsky <npostavs@users.sourceforge.net>
> >> Date: Tue, 21 Jun 2016 17:03:21 -0400
> >> Cc: 10980@debbugs.gnu.org, bo.johansson@lsn.se
> >>
> >> I feel like I'm missing some important point here. If these
> >> environment variables won't affect subprocess environments, why set
> >> them at all?
> >
> > Because Emacs itself needs them. They must be in Emacs's environment,
> > but don't have to be in Vprocess_environment.
>
> What does it need them for?
Various features in Emacs rely on them to be present and valid
(because that's what happens on Posix systems).
> Just because Emacs consults the values from its environment?
Yes.
> Is there some reason not to use just plain old global variables?
On all platforms, or just on Windows?
In any case, doing that would mean a much larger job, even if it's
possible. E.g., how do you deal with Lisp code that expects
(expand-file-name "~") and (getenv "HOME") to yield the same value?
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-22 14:57 ` Eli Zaretskii
@ 2016-06-29 13:12 ` Noam Postavsky
2016-06-29 15:15 ` Eli Zaretskii
0 siblings, 1 reply; 15+ messages in thread
From: Noam Postavsky @ 2016-06-29 13:12 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: bo.johansson, 10980
On Wed, Jun 22, 2016 at 10:57 AM, Eli Zaretskii <eliz@gnu.org> wrote:
> In any case, doing that would mean a much larger job, even if it's
> possible. E.g., how do you deal with Lisp code that expects
> (expand-file-name "~") and (getenv "HOME") to yield the same value?
Hmm, so it's easy enough to move setting of both Vprocess_environment
and Vinitial_environment before the Windows code starts adding to the
environment. And getenv would have to be modified to consult Emacs'
environment so that that (expand-file-name "~") and (getenv "HOME")
give the same values.
But it seems we would then need 2 sets of functions: getenv/setenv and
get-subproc-env/set-subproc-env (the latter working on
Vprocess_environment only). This feels like a complication with not
much benefit.
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-29 13:12 ` Noam Postavsky
@ 2016-06-29 15:15 ` Eli Zaretskii
2016-06-29 15:26 ` Noam Postavsky
0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2016-06-29 15:15 UTC (permalink / raw)
To: Noam Postavsky; +Cc: bo.johansson, 10980
> From: Noam Postavsky <npostavs@users.sourceforge.net>
> Date: Wed, 29 Jun 2016 09:12:39 -0400
> Cc: 10980@debbugs.gnu.org, bo.johansson@lsn.se
>
> On Wed, Jun 22, 2016 at 10:57 AM, Eli Zaretskii <eliz@gnu.org> wrote:
> > In any case, doing that would mean a much larger job, even if it's
> > possible. E.g., how do you deal with Lisp code that expects
> > (expand-file-name "~") and (getenv "HOME") to yield the same value?
>
> Hmm, so it's easy enough to move setting of both Vprocess_environment
> and Vinitial_environment before the Windows code starts adding to the
> environment.
I'd actually suggest doing it the other way around: move the
Windows-specific code in w32.c that pushes these variables into the
environment after Vprocess_environment and Vinitial_environment were
already computed. That way, we are sure the only affected platform is
w32. (Order of initialization at startup matters, so best not to rock
the boat there, unless we absolutely have to.)
> And getenv would have to be modified to consult Emacs'
> environment so that that (expand-file-name "~") and (getenv "HOME")
> give the same values.
C 'getenv' or Lisp 'getenv'?
> But it seems we would then need 2 sets of functions: getenv/setenv and
> get-subproc-env/set-subproc-env (the latter working on
> Vprocess_environment only). This feels like a complication with not
> much benefit.
We already have that: there's 'getenv' and 'egetenv' on the C level.
And the Lisp 'setenv' is already documented to modify
process-environment. So I'm not sure I see the problem (although it's
clear that getenv_internal_1 will probably need some Windows specific
changes.)
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-29 15:15 ` Eli Zaretskii
@ 2016-06-29 15:26 ` Noam Postavsky
2016-06-29 15:34 ` Eli Zaretskii
0 siblings, 1 reply; 15+ messages in thread
From: Noam Postavsky @ 2016-06-29 15:26 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: bo.johansson, 10980
On Wed, Jun 29, 2016 at 11:15 AM, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Noam Postavsky <npostavs@users.sourceforge.net>
>> And getenv would have to be modified to consult Emacs'
>> environment so that that (expand-file-name "~") and (getenv "HOME")
>> give the same values.
>
> C 'getenv' or Lisp 'getenv'?
Sorry, I meant Lisp getenv.
>> But it seems we would then need 2 sets of functions: getenv/setenv and
>> get-subproc-env/set-subproc-env (the latter working on
>> Vprocess_environment only). This feels like a complication with not
>> much benefit.
>
> We already have that: there's 'getenv' and 'egetenv' on the C level.
> And the Lisp 'setenv' is already documented to modify
> process-environment. So I'm not sure I see the problem
What about a lisp program that expects (expand-file-name "~") and
(getenv "HOME") to give the same results after running (setenv "HOME"
<whatever>)
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-29 15:26 ` Noam Postavsky
@ 2016-06-29 15:34 ` Eli Zaretskii
2016-06-29 23:02 ` Noam Postavsky
0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2016-06-29 15:34 UTC (permalink / raw)
To: Noam Postavsky; +Cc: bo.johansson, 10980
> From: Noam Postavsky <npostavs@users.sourceforge.net>
> Date: Wed, 29 Jun 2016 11:26:04 -0400
> Cc: 10980@debbugs.gnu.org, bo.johansson@lsn.se
>
> >> But it seems we would then need 2 sets of functions: getenv/setenv and
> >> get-subproc-env/set-subproc-env (the latter working on
> >> Vprocess_environment only). This feels like a complication with not
> >> much benefit.
> >
> > We already have that: there's 'getenv' and 'egetenv' on the C level.
> > And the Lisp 'setenv' is already documented to modify
> > process-environment. So I'm not sure I see the problem
>
> What about a lisp program that expects (expand-file-name "~") and
> (getenv "HOME") to give the same results after running (setenv "HOME"
> <whatever>)
The changes in getenv_internal_1 (or, rather, in getenv_internal) that
I mentioned will have to make that happen. It already does something
similar.
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-29 15:34 ` Eli Zaretskii
@ 2016-06-29 23:02 ` Noam Postavsky
2016-07-09 10:57 ` Eli Zaretskii
0 siblings, 1 reply; 15+ messages in thread
From: Noam Postavsky @ 2016-06-29 23:02 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: bo.johansson, 10980
[-- Attachment #1: Type: text/plain, Size: 1170 bytes --]
On Wed, Jun 29, 2016 at 11:34 AM, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Noam Postavsky <npostavs@users.sourceforge.net>
>> Date: Wed, 29 Jun 2016 11:26:04 -0400
>> Cc: 10980@debbugs.gnu.org, bo.johansson@lsn.se
>>
>> >> But it seems we would then need 2 sets of functions: getenv/setenv and
>> >> get-subproc-env/set-subproc-env (the latter working on
>> >> Vprocess_environment only). This feels like a complication with not
>> >> much benefit.
>> >
>> > We already have that: there's 'getenv' and 'egetenv' on the C level.
>> > And the Lisp 'setenv' is already documented to modify
>> > process-environment. So I'm not sure I see the problem
>>
>> What about a lisp program that expects (expand-file-name "~") and
>> (getenv "HOME") to give the same results after running (setenv "HOME"
>> <whatever>)
>
> The changes in getenv_internal_1 (or, rather, in getenv_internal) that
> I mentioned will have to make that happen. It already does something
> similar.
Ah, I think I missed the idea that changing Vprocess_environment would
still affect Emacs' environment (technically, what Emacs thinks its
environment is, which has the same effect). Patch attached.
[-- Attachment #2: v2-0001-Keep-w32-environment-settings-internal-only.patch --]
[-- Type: application/octet-stream, Size: 2877 bytes --]
From 003a86a1779694d9b5aaa44d5557854dd9c2dceb Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Wed, 29 Jun 2016 18:52:57 -0400
Subject: [PATCH v2] Keep w32 environment settings internal only
* src/emacs.c (main): For WINDOWSNT platform, move init_environment
calls after the set_initial_environment call. This prevents Emacs'
modifications to the environment from contaminating Vprocess_environment
and Vinitial_environment (Bug #10980).
* src/callproc.c (getenv_internal): Consult Emacs' internal environment
in as a fallback to Vprocess_environment on WINDOWSNT platforms.
---
src/callproc.c | 14 ++++++++++++++
src/emacs.c | 24 ++++++++++++++----------
2 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/src/callproc.c b/src/callproc.c
index 7008b91..7880238 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -1375,6 +1375,20 @@ getenv_internal (const char *var, ptrdiff_t varlen, char **value,
Vprocess_environment))
return *value ? 1 : 0;
+ /* On Windows we make some modifications to Emacs' enviroment
+ without recording them in Vprocess_environment. */
+#ifdef WINDOWSNT
+ {
+ char* tmpval = getenv (var);
+ if (tmpval)
+ {
+ *value = tmpval;
+ *valuelen = strlen(tmpval);
+ return 1;
+ }
+ }
+#endif
+
/* For DISPLAY try to get the values from the frame or the initial env. */
if (strcmp (var, "DISPLAY") == 0)
{
diff --git a/src/emacs.c b/src/emacs.c
index bb85733..f977289 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -1351,16 +1351,6 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
globals_of_gfilenotify ();
#endif
-#ifdef WINDOWSNT
- globals_of_w32 ();
-#ifdef HAVE_W32NOTIFY
- globals_of_w32notify ();
-#endif
- /* Initialize environment from registry settings. */
- init_environment (argv);
- init_ntproc (dumping); /* must precede init_editfns. */
-#endif
-
#ifdef HAVE_NS
/* Initialize the locale from user defaults. */
ns_init_locale ();
@@ -1377,6 +1367,20 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
if (! dumping)
set_initial_environment ();
+#ifdef WINDOWSNT
+ globals_of_w32 ();
+#ifdef HAVE_W32NOTIFY
+ globals_of_w32notify ();
+#endif
+ /* Initialize environment from registry settings. Make sure to do
+ this only after calling set_initial_environment so that
+ Vinitial_environment and Vprocess_environment will contain only
+ variables from the parent process without modifications from
+ Emacs. */
+ init_environment (argv);
+ init_ntproc (dumping); /* must precede init_editfns. */
+#endif
+
/* AIX crashes are reported in system versions 3.2.3 and 3.2.4
if this is not done. Do it after set_global_environment so that we
don't pollute Vglobal_environment. */
--
2.6.2.windows.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-06-29 23:02 ` Noam Postavsky
@ 2016-07-09 10:57 ` Eli Zaretskii
2016-07-18 21:52 ` Noam Postavsky
0 siblings, 1 reply; 15+ messages in thread
From: Eli Zaretskii @ 2016-07-09 10:57 UTC (permalink / raw)
To: Noam Postavsky; +Cc: bo.johansson, 10980
> From: Noam Postavsky <npostavs@users.sourceforge.net>
> Date: Wed, 29 Jun 2016 19:02:25 -0400
> Cc: 10980@debbugs.gnu.org, bo.johansson@lsn.se
>
> Ah, I think I missed the idea that changing Vprocess_environment would
> still affect Emacs' environment (technically, what Emacs thinks its
> environment is, which has the same effect). Patch attached.
Thanks, please push to master, after fixing the following minor
issues:
> * src/emacs.c (main): For WINDOWSNT platform, move init_environment
> calls after the set_initial_environment call. This prevents Emacs'
> modifications to the environment from contaminating Vprocess_environment
> and Vinitial_environment (Bug #10980).
Code changes in fragments guarded by preprocessor conditionals should
be formatted like this:
* src/emacs.c (main) [WINDOWSNT]: Move init_environment calls after ...
> * src/callproc.c (getenv_internal): Consult Emacs' internal environment
> in as a fallback to Vprocess_environment on WINDOWSNT platforms.
Same here.
> + *valuelen = strlen(tmpval);
^^^^^^^
Please leave a single blank between a function's name and the
following opening parenthesis.
> + /* Initialize environment from registry settings. Make sure to do
> + this only after calling set_initial_environment so that
> + Vinitial_environment and Vprocess_environment will contain only
> + variables from the parent process without modifications from
> + Emacs. */
Please leave 2 blanks between the last period of the comment text and
the comment terminator "*/".
Bonus points for adding a test for this issue.
^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#10980: GNU bugs information: logs for bug#10980
2016-07-09 10:57 ` Eli Zaretskii
@ 2016-07-18 21:52 ` Noam Postavsky
0 siblings, 0 replies; 15+ messages in thread
From: Noam Postavsky @ 2016-07-18 21:52 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: bo.johansson, 10980
close 10980 25.2
quit
On Sat, Jul 9, 2016 at 6:57 AM, Eli Zaretskii <eliz@gnu.org> wrote:
> Thanks, please push to master, after fixing the following minor
> issues:
[...]
> Bonus points for adding a test for this issue.
Done and done, 73f0715d
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2016-07-18 21:52 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CAM-tV-8GBPbR3WO9Y_k6mrWop2ZcJCL16R9R2=zmFU5brRp5+w@mail.gmail.com>
[not found] ` <handler.s.R.14653322689344.info.0@debbugs.gnu.org>
2016-06-08 3:54 ` bug#10980: GNU bugs information: logs for bug#10980 Noam Postavsky
2016-06-08 16:40 ` Eli Zaretskii
2016-06-21 0:23 ` Noam Postavsky
2016-06-21 13:27 ` Eli Zaretskii
2016-06-21 21:03 ` Noam Postavsky
2016-06-22 2:39 ` Eli Zaretskii
2016-06-22 2:54 ` Noam Postavsky
2016-06-22 14:57 ` Eli Zaretskii
2016-06-29 13:12 ` Noam Postavsky
2016-06-29 15:15 ` Eli Zaretskii
2016-06-29 15:26 ` Noam Postavsky
2016-06-29 15:34 ` Eli Zaretskii
2016-06-29 23:02 ` Noam Postavsky
2016-07-09 10:57 ` Eli Zaretskii
2016-07-18 21:52 ` Noam Postavsky
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).