* $USERPROFILE for $HOME on W32
@ 2004-11-22 6:26 Stefan Monnier
2004-11-22 8:44 ` Jason Rumney
` (2 more replies)
0 siblings, 3 replies; 35+ messages in thread
From: Stefan Monnier @ 2004-11-22 6:26 UTC (permalink / raw)
To follow up on the thread, here is a suggested patch.
Any objection?
If anybody wants to install it (with or without adjustments), please feel
free to do it: I'd rather not spend any more time on this.
Stefan
--- startup.el 17 oct 2004 18:58:12 -0400 1.333
+++ startup.el 22 nov 2004 01:23:05 -0500
@@ -340,6 +340,14 @@
(if command-line-processed
(message "Back to top level.")
(setq command-line-processed t)
+ ;; On W32, try to use $USERPROFILE if $HOME isn't properly set.
+ (when (and (memq system-type '(windows-nt))
+ (equal (getenv "HOME") "C:/")
+ (not (file-exists-p "~/.emacs"))
+ (not (file-exists-p "~/_emacs"))
+ (getenv "USERPROFILE")
+ (file-writable-p (getenv "USERPROFILE")))
+ (setenv "HOME" (getenv "USERPROFILE")))
;; Give *Messages* the same default-directory as *scratch*,
;; just to keep things predictable.
(let ((dir default-directory))
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-22 6:26 $USERPROFILE for $HOME on W32 Stefan Monnier
@ 2004-11-22 8:44 ` Jason Rumney
2004-11-22 13:04 ` Stefan Monnier
` (2 more replies)
2004-11-22 15:46 ` Eli Zaretskii
2004-11-24 8:17 ` John Paul Wallington
2 siblings, 3 replies; 35+ messages in thread
From: Jason Rumney @ 2004-11-22 8:44 UTC (permalink / raw)
Cc: emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> To follow up on the thread, here is a suggested patch.
> Any objection?
I'd rather put the code in init_environment() in w32.c, and keep all
hacking of environment variables in one place.
> --- startup.el 17 oct 2004 18:58:12 -0400 1.333
> +++ startup.el 22 nov 2004 01:23:05 -0500
> @@ -340,6 +340,14 @@
> (if command-line-processed
> (message "Back to top level.")
> (setq command-line-processed t)
> + ;; On W32, try to use $USERPROFILE if $HOME isn't properly set.
> + (when (and (memq system-type '(windows-nt))
> + (equal (getenv "HOME") "C:/")
> + (not (file-exists-p "~/.emacs"))
> + (not (file-exists-p "~/_emacs"))
> + (getenv "USERPROFILE")
> + (file-writable-p (getenv "USERPROFILE")))
> + (setenv "HOME" (getenv "USERPROFILE")))
> ;; Give *Messages* the same default-directory as *scratch*,
> ;; just to keep things predictable.
> (let ((dir default-directory))
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-22 8:44 ` Jason Rumney
@ 2004-11-22 13:04 ` Stefan Monnier
2004-11-25 16:00 ` Stefan Monnier
2004-12-06 23:17 ` Lennart Borgman
2 siblings, 0 replies; 35+ messages in thread
From: Stefan Monnier @ 2004-11-22 13:04 UTC (permalink / raw)
Cc: emacs-devel
>> To follow up on the thread, here is a suggested patch.
>> Any objection?
> I'd rather put the code in init_environment() in w32.c, and keep all
> hacking of environment variables in one place.
Well, I'd myself rather move it all into elisp where we have a lot
more flexibility. It's not like speed is important there.
But if you want to write it in C, go for it, I myself just want to get the
behavior implemented so I stop getting complaints from users around me,
Stefan
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-22 6:26 $USERPROFILE for $HOME on W32 Stefan Monnier
2004-11-22 8:44 ` Jason Rumney
@ 2004-11-22 15:46 ` Eli Zaretskii
2004-11-22 16:47 ` Stefan Monnier
2004-11-23 8:30 ` Jason Rumney
2004-11-24 8:17 ` John Paul Wallington
2 siblings, 2 replies; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-22 15:46 UTC (permalink / raw)
Cc: emacs-devel
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Mon, 22 Nov 2004 01:26:51 -0500
>
> + ;; On W32, try to use $USERPROFILE if $HOME isn't properly set.
> + (when (and (memq system-type '(windows-nt))
Shouldn't this take effect for the Cygwin build as well?
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-22 15:46 ` Eli Zaretskii
@ 2004-11-22 16:47 ` Stefan Monnier
2004-11-23 11:49 ` Eli Zaretskii
2004-11-23 8:30 ` Jason Rumney
1 sibling, 1 reply; 35+ messages in thread
From: Stefan Monnier @ 2004-11-22 16:47 UTC (permalink / raw)
Cc: emacs-devel
>> + ;; On W32, try to use $USERPROFILE if $HOME isn't properly set.
>> + (when (and (memq system-type '(windows-nt))
> Shouldn't this take effect for the Cygwin build as well?
Quite possible, but I only have experience with `windows-nt'.
Note that I used the `memq' form to make it trivial to add other cases like
cygwin or ms-dos.
Stefan
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-22 15:46 ` Eli Zaretskii
2004-11-22 16:47 ` Stefan Monnier
@ 2004-11-23 8:30 ` Jason Rumney
2004-11-23 11:32 ` Eli Zaretskii
1 sibling, 1 reply; 35+ messages in thread
From: Jason Rumney @ 2004-11-23 8:30 UTC (permalink / raw)
Cc: Stefan Monnier, emacs-devel
"Eli Zaretskii" <eliz@gnu.org> writes:
>> From: Stefan Monnier <monnier@iro.umontreal.ca>
>> Date: Mon, 22 Nov 2004 01:26:51 -0500
>>
>> + ;; On W32, try to use $USERPROFILE if $HOME isn't properly set.
>> + (when (and (memq system-type '(windows-nt))
>
> Shouldn't this take effect for the Cygwin build as well?
I may be wrong, but I think HOME will always be defined under Cygwin.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-23 8:30 ` Jason Rumney
@ 2004-11-23 11:32 ` Eli Zaretskii
2004-11-23 20:47 ` Jason Rumney
0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-23 11:32 UTC (permalink / raw)
Cc: monnier, emacs-devel
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel@gnu.org
> From: Jason Rumney <jasonr@gnu.org>
> Date: Tue, 23 Nov 2004 08:30:35 +0000
>
> "Eli Zaretskii" <eliz@gnu.org> writes:
>
> >> From: Stefan Monnier <monnier@iro.umontreal.ca>
> >> Date: Mon, 22 Nov 2004 01:26:51 -0500
> >>
> >> + ;; On W32, try to use $USERPROFILE if $HOME isn't properly set.
> >> + (when (and (memq system-type '(windows-nt))
> >
> > Shouldn't this take effect for the Cygwin build as well?
>
> I may be wrong, but I think HOME will always be defined under Cygwin.
I thought about that, but just wasn't sure. Someone who knows more
about Cygwin should tell, I guess.
In any case, if we suspect $HOME is always set on Cygwin, adding it to
the list won't do any harm.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-22 16:47 ` Stefan Monnier
@ 2004-11-23 11:49 ` Eli Zaretskii
0 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-23 11:49 UTC (permalink / raw)
Cc: emacs-devel
> Cc: emacs-devel@gnu.org
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Mon, 22 Nov 2004 11:47:48 -0500
>
> Note that I used the `memq' form to make it trivial to add other cases like
> cygwin or ms-dos.
ms-dos does not need to be added, as the MS-DOS port already has the
necessary magic to always have $HOME defined (around line 4478 in
msdos.c). The user-level consequences of that are described near the
end of the node `(emacs)MS-DOS File Names'.
But having memq there is good anyway, IMHO. Thanks.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-23 11:32 ` Eli Zaretskii
@ 2004-11-23 20:47 ` Jason Rumney
2004-11-23 20:57 ` Eli Zaretskii
0 siblings, 1 reply; 35+ messages in thread
From: Jason Rumney @ 2004-11-23 20:47 UTC (permalink / raw)
Cc: monnier, emacs-devel
"Eli Zaretskii" <eliz@gnu.org> writes:
> In any case, if we suspect $HOME is always set on Cygwin, adding it to
> the list won't do any harm.
It will if $HOME is set to "C:/" deliberately and .emacs does not
exist yet. This applies on the native Windows build as well, which is
another reason why it would be better to do this in the same place as
HOME is set to C:/ (whether we move this to C, or move the current
code to Lisp, I have no preference) and do it if HOME is unset rather
than if HOME is set to "C:/".
I don't think Cygwin has code to default HOME to "C:/" (the cygwin path
would be /cygdrive/c/ anyway), if it does then it should probably be
"/home" or "/home/$USER" anyway, making it $USERPROFILE does not fit
with the Cygwin way of doing things.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-23 20:47 ` Jason Rumney
@ 2004-11-23 20:57 ` Eli Zaretskii
0 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-23 20:57 UTC (permalink / raw)
Cc: monnier, emacs-devel
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> From: Jason Rumney <jasonr@gnu.org>
> Date: Tue, 23 Nov 2004 20:47:53 +0000
>
> "Eli Zaretskii" <eliz@gnu.org> writes:
>
> > In any case, if we suspect $HOME is always set on Cygwin, adding it to
> > the list won't do any harm.
>
> It will if $HOME is set to "C:/" deliberately and .emacs does not
> exist yet. This applies on the native Windows build as well
Exactly: adding Cygwin to the list will not do any harm beyond what
the suggested patch already does for the native build.
Anyway, setting HOME to "C:/" is silly, IMHO.
> another reason why it would be better to do this in the same place as
> HOME is set to C:/
I agree.
> I don't think Cygwin has code to default HOME to "C:/"
The Cygwin build runs the Unix code, so there's no setting of HOME
anywhere in it.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-22 6:26 $USERPROFILE for $HOME on W32 Stefan Monnier
2004-11-22 8:44 ` Jason Rumney
2004-11-22 15:46 ` Eli Zaretskii
@ 2004-11-24 8:17 ` John Paul Wallington
2 siblings, 0 replies; 35+ messages in thread
From: John Paul Wallington @ 2004-11-24 8:17 UTC (permalink / raw)
Cc: emacs-devel
> To follow up on the thread, here is a suggested patch.
> Any objection?
Disclaimer: I don't know much about Windows. I think that MIT/GNU
Scheme Edwin uses HOMEDRIVE and HOMEPATH rather than USERPROFILE. I
noticed that on an NT 3.51 system HOMEDRIVE and HOMEPATH have sane
values but USERPROFILE isn't defined. On an XP system USERPROFILE is
the same as concatenating HOMEDRIVE and HOMEPATH.
Perhaps we could fall back on using HOMEDRIVE and HOMEPATH if
USERPROFILE doesn't exist or isn't writable ?
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-22 8:44 ` Jason Rumney
2004-11-22 13:04 ` Stefan Monnier
@ 2004-11-25 16:00 ` Stefan Monnier
2004-11-25 16:34 ` Jason Rumney
` (2 more replies)
2004-12-06 23:17 ` Lennart Borgman
2 siblings, 3 replies; 35+ messages in thread
From: Stefan Monnier @ 2004-11-25 16:00 UTC (permalink / raw)
Cc: emacs-devel
Here is a new patch. Could people try it out and tell me if it works?
And tell me how to fix it (I can't try it out, I wish someone could help me
out, really, because coding and debugging blindly like that isn't much fun).
Stefan
Index: src/w32.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/w32.c,v
retrieving revision 1.89
diff -u -r1.89 w32.c
--- src/w32.c 19 Oct 2004 19:08:58 -0000 1.89
+++ src/w32.c 25 Nov 2004 16:03:01 -0000
@@ -1,5 +1,5 @@
/* Utility and Unix shadow routines for GNU Emacs on the Microsoft W32 API.
- Copyright (C) 1994, 1995, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1994, 1995, 2000, 2001, 2004 Free Software Foundation, Inc.
This file is part of GNU Emacs.
@@ -424,7 +424,12 @@
getpwuid (int uid)
{
if (uid == the_passwd.pw_uid)
- return &the_passwd;
+ {
+ /* Set dir and shell from environment variables. */
+ strcpy (the_passwd.pw_dir, getenv ("HOME"));
+ strcpy (the_passwd.pw_shell, getenv ("SHELL"));
+ return &the_passwd;
+ }
return NULL;
}
@@ -531,16 +536,6 @@
the_passwd.pw_gid = 123;
}
- /* Ensure HOME and SHELL are defined. */
- if (getenv ("HOME") == NULL)
- abort ();
- if (getenv ("SHELL") == NULL)
- abort ();
-
- /* Set dir and shell from environment variables. */
- strcpy (the_passwd.pw_dir, getenv ("HOME"));
- strcpy (the_passwd.pw_shell, getenv ("SHELL"));
-
if (token)
CloseHandle (token);
}
@@ -949,11 +944,9 @@
char * def_value;
} env_vars[] =
{
- {"HOME", "C:/"},
{"PRELOAD_WINSOCK", NULL},
{"emacs_dir", "C:/emacs"},
{"EMACSLOADPATH", "%emacs_dir%/site-lisp;%emacs_dir%/../site-lisp;%emacs_dir%/lisp;%emacs_dir%/leim"},
- {"SHELL", "%emacs_dir%/bin/cmdproxy.exe"},
{"EMACSDATA", "%emacs_dir%/etc"},
{"EMACSPATH", "%emacs_dir%/bin"},
/* We no longer set INFOPATH because Info-default-directory-list
Index: lisp/w32-fns.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/w32-fns.el,v
retrieving revision 1.54
diff -u -r1.54 w32-fns.el
--- lisp/w32-fns.el 30 May 2004 21:19:06 -0000 1.54
+++ lisp/w32-fns.el 25 Nov 2004 16:03:01 -0000
@@ -195,6 +195,28 @@
(goto-char (point-min)))
+
+(defun w32-early-setenv ()
+ "Setup sane default values for important environment variables."
+ (unless (getenv "HOME")
+ ;; Try to use $USERPROFILE if $HOME isn't properly set.
+ (setenv "HOME"
+ (cond
+ ((or (file-readable-p "C:/.emacs") (file-readable-p "C:/_emacs"))
+ ;; Backward compatibility with old default of "C:/".
+ "C:/")
+ ((and (getenv "USERPROFILE")
+ (file-writable-p (getenv "USERPROFILE")))
+ (getenv "USERPROFILE"))
+ ((and (getenv "HOMEPATH") (getenv "HOMEDRIVE")
+ (file-writable-p
+ (expand-file-name (getenv "HOMEPATH") (getenv "HOMEDRIVE"))))
+ (expand-file-name (getenv "HOMEPATH") (getenv "HOMEDRIVE")))
+ (t "C:/"))))
+ (unless (getenv "SHELL")
+ ;; When is %emacs_dir% expanded? Should I do it here?
+ (setenv "SHELL" "%emacs_dir%/bin/cmdproxy.exe")))
+
;;; Setup Info-default-directory-list to include the info directory
;;; near where Emacs executable was installed. We used to set INFOPATH,
;;; but when this is set Info-default-directory-list is ignored. We
@@ -454,5 +476,5 @@
(setq interprogram-paste-function 'x-get-selection-value)
-;;; arch-tag: c49b48cc-0f4f-454f-a274-c2dc34815e14
+;; arch-tag: c49b48cc-0f4f-454f-a274-c2dc34815e14
;;; w32-fns.el ends here
Index: lisp/startup.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/startup.el,v
retrieving revision 1.333
diff -u -r1.333 startup.el
--- lisp/startup.el 17 Oct 2004 06:56:40 -0000 1.333
+++ lisp/startup.el 25 Nov 2004 16:03:01 -0000
@@ -340,6 +340,9 @@
(if command-line-processed
(message "Back to top level.")
(setq command-line-processed t)
+ (when (memq system-type '(windows-nt))
+ ;; Set HOME and SHELL if necessary.
+ (w32-early-setenv))
;; Give *Messages* the same default-directory as *scratch*,
;; just to keep things predictable.
(let ((dir default-directory))
@@ -1728,5 +1731,5 @@
(setq file (replace-match "/" t t file)))
file))
-;;; arch-tag: 7e294698-244d-4758-984b-4047f887a5db
+;; arch-tag: 7e294698-244d-4758-984b-4047f887a5db
;;; startup.el ends here
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 16:00 ` Stefan Monnier
@ 2004-11-25 16:34 ` Jason Rumney
2004-11-25 16:54 ` Stefan
2004-11-25 16:57 ` Andreas Schwab
2004-11-25 22:04 ` Eli Zaretskii
2 siblings, 1 reply; 35+ messages in thread
From: Jason Rumney @ 2004-11-25 16:34 UTC (permalink / raw)
Cc: emacs-devel
Stefan Monnier wrote:
>Here is a new patch. Could people try it out and tell me if it works?
>And tell me how to fix it (I can't try it out, I wish someone could help me
>out, really, because coding and debugging blindly like that isn't much fun).
>
>
I haven't had time yet to test the whole patch, but I did a quick test
of the bit you were'nt sure of:
>+ (unless (getenv "SHELL")
>+ ;; When is %emacs_dir% expanded? Should I do it here?
>+ (setenv "SHELL" "%emacs_dir%/bin/cmdproxy.exe")))
>+
>
>
(setenv "TESTSHELL" "%emacs_dir%/bin/cmdproxy.exe")
"%emacs_dir%/bin/cmdproxy.exe"
(getenv "SHELL")
"C:/emacs/bin/cmdproxy.exe"
(getenv "TESTSHELL")
"%emacs_dir%/bin/cmdproxy.exe"
So I think that will need to be:
(setenv "SHELL" (concat (getenv "emacs_dir") "/bin/cmdproxy.exe"))
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 16:34 ` Jason Rumney
@ 2004-11-25 16:54 ` Stefan
2004-11-25 21:52 ` Eli Zaretskii
0 siblings, 1 reply; 35+ messages in thread
From: Stefan @ 2004-11-25 16:54 UTC (permalink / raw)
Cc: emacs-devel
> I haven't had time yet to test the whole patch, but I did a quick test of
> the bit you were'nt sure of:
Thanks (tho it's not like I'm sure of the rest either ;-).
> (setenv "SHELL" (concat (getenv "emacs_dir") "/bin/cmdproxy.exe"))
Hmm... OK.
Does anyone know where the %emacs_dir% expansion takes place in the current
code (if you look at my patch you'll note that in w32.c the current code
(which my patch removes) gives "%emacs_dir%/bin/cmdproxy.exe" as default for
SHELL) ?
Stefan
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 16:00 ` Stefan Monnier
2004-11-25 16:34 ` Jason Rumney
@ 2004-11-25 16:57 ` Andreas Schwab
2004-11-25 17:45 ` Stefan
2004-11-25 22:04 ` Eli Zaretskii
2 siblings, 1 reply; 35+ messages in thread
From: Andreas Schwab @ 2004-11-25 16:57 UTC (permalink / raw)
Cc: emacs-devel, Jason Rumney
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> @@ -424,7 +424,12 @@
> getpwuid (int uid)
> {
> if (uid == the_passwd.pw_uid)
> - return &the_passwd;
> + {
> + /* Set dir and shell from environment variables. */
> + strcpy (the_passwd.pw_dir, getenv ("HOME"));
What if strlen (getenv ("HOME")) >= sizeof (the_passwd.pw_dir)?
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 16:57 ` Andreas Schwab
@ 2004-11-25 17:45 ` Stefan
2004-11-25 17:49 ` Andreas Schwab
2004-11-25 21:45 ` Eli Zaretskii
0 siblings, 2 replies; 35+ messages in thread
From: Stefan @ 2004-11-25 17:45 UTC (permalink / raw)
Cc: emacs-devel, Jason Rumney
>> + /* Set dir and shell from environment variables. */
>> + strcpy (the_passwd.pw_dir, getenv ("HOME"));
> What if strlen (getenv ("HOME")) >= sizeof (the_passwd.pw_dir)?
Well, tough!
This code is not new: it's just moved from one place to another so it's not
a new problem.
Stefan
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 17:45 ` Stefan
@ 2004-11-25 17:49 ` Andreas Schwab
2004-11-25 21:45 ` Eli Zaretskii
1 sibling, 0 replies; 35+ messages in thread
From: Andreas Schwab @ 2004-11-25 17:49 UTC (permalink / raw)
Cc: emacs-devel, Jason Rumney
Stefan <monnier@iro.umontreal.ca> writes:
>>> + /* Set dir and shell from environment variables. */
>>> + strcpy (the_passwd.pw_dir, getenv ("HOME"));
>
>> What if strlen (getenv ("HOME")) >= sizeof (the_passwd.pw_dir)?
>
> Well, tough!
> This code is not new: it's just moved from one place to another so it's not
> a new problem.
I know, but it is still worth to be fixed. I don't see why it can't be
dynamically allocated in the first place.
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 17:45 ` Stefan
2004-11-25 17:49 ` Andreas Schwab
@ 2004-11-25 21:45 ` Eli Zaretskii
2004-11-26 20:56 ` Eli Zaretskii
1 sibling, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-25 21:45 UTC (permalink / raw)
Cc: jasonr, emacs-devel
> From: Stefan <monnier@iro.umontreal.ca>
> Date: Thu, 25 Nov 2004 12:45:48 -0500
> Cc: emacs-devel@gnu.org, Jason Rumney <jasonr@gnu.org>
>
> >> + /* Set dir and shell from environment variables. */
> >> + strcpy (the_passwd.pw_dir, getenv ("HOME"));
>
> > What if strlen (getenv ("HOME")) >= sizeof (the_passwd.pw_dir)?
>
> Well, tough!
> This code is not new: it's just moved from one place to another so it's not
> a new problem.
Can you (or someone else) look at the w32 system headers and see how
struct passwd is defined there? I looked at two implementations
(DJGPP and glibc on Debian GNU/Linux), and they both define pw_dir and
pw_shell as `char *'. So using strcpy here might mean a disaster, as
no memory could have been allocated for them; I'd use strdup instead.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 16:54 ` Stefan
@ 2004-11-25 21:52 ` Eli Zaretskii
2004-11-25 22:46 ` Jason Rumney
0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-25 21:52 UTC (permalink / raw)
Cc: emacs-devel, jasonr
> From: Stefan <monnier@iro.umontreal.ca>
> Date: Thu, 25 Nov 2004 11:54:51 -0500
> Cc: emacs-devel@gnu.org
>
> Does anyone know where the %emacs_dir% expansion takes place in the current
> code
It's on line 1005 of w32.c and again on line 1029 there (the former
for running Emacs from a standard installation of the binary package,
the latter for running from the build directory). The function that
does that is init_environment.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 16:00 ` Stefan Monnier
2004-11-25 16:34 ` Jason Rumney
2004-11-25 16:57 ` Andreas Schwab
@ 2004-11-25 22:04 ` Eli Zaretskii
2004-11-25 23:43 ` Stefan Monnier
2 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-25 22:04 UTC (permalink / raw)
Cc: emacs-devel, jasonr
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Thu, 25 Nov 2004 11:00:39 -0500
> Cc: emacs-devel@gnu.org
>
> Here is a new patch. Could people try it out and tell me if it works?
> And tell me how to fix it
I still think, like Jason, that all the environment variables frobbing
on w32 should be in w32.c:init_environment, not in Lisp. Moving it to
Lisp means, e.g., that temacs will have different ideas about HOME
etc. than the dumped Emacs, which I think might confuse someone some
day. See below for another reason.
> getpwuid (int uid)
> {
> if (uid == the_passwd.pw_uid)
> - return &the_passwd;
> + {
> + /* Set dir and shell from environment variables. */
> + strcpy (the_passwd.pw_dir, getenv ("HOME"));
> + strcpy (the_passwd.pw_shell, getenv ("SHELL"));
> + return &the_passwd;
> + }
> return NULL;
> }
This change means that we run this code every time getpwuid is called.
That's too excessive, I think, and could be avoided if all the
environment frobbing were done in C.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 21:52 ` Eli Zaretskii
@ 2004-11-25 22:46 ` Jason Rumney
2004-11-26 10:32 ` Eli Zaretskii
0 siblings, 1 reply; 35+ messages in thread
From: Jason Rumney @ 2004-11-25 22:46 UTC (permalink / raw)
Cc: Stefan, emacs-devel
"Eli Zaretskii" <eliz@gnu.org> writes:
>> Does anyone know where the %emacs_dir% expansion takes place in the current
>> code
>
> It's on line 1005 of w32.c and again on line 1029 there (the former
> for running Emacs from a standard installation of the binary package,
> the latter for running from the build directory). The function that
> does that is init_environment.
Line 1055 is where the actual expansion takes place in both cases.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 22:04 ` Eli Zaretskii
@ 2004-11-25 23:43 ` Stefan Monnier
2004-11-26 10:29 ` Eli Zaretskii
0 siblings, 1 reply; 35+ messages in thread
From: Stefan Monnier @ 2004-11-25 23:43 UTC (permalink / raw)
Cc: emacs-devel, jasonr
> Lisp means, e.g., that temacs will have different ideas about HOME
> etc. than the dumped Emacs, which I think might confuse someone some
Huh? Of course HOME is different before and after the dump.
How could it be otherwise?
>> getpwuid (int uid)
>> {
>> if (uid == the_passwd.pw_uid)
>> - return &the_passwd;
>> + {
>> + /* Set dir and shell from environment variables. */
>> + strcpy (the_passwd.pw_dir, getenv ("HOME"));
>> + strcpy (the_passwd.pw_shell, getenv ("SHELL"));
>> + return &the_passwd;
>> + }
>> return NULL;
>> }
> This change means that we run this code every time getpwuid is called.
Right. Just as we do it on Unix (except on Unix we only do it for HOME
and not for SHELL).
> That's too excessive, I think,
Doesn't seem to bother people on Unix.
> and could be avoided if all the
> environment frobbing were done in C.
There are many ways to avoid such repetition if it's a problem.
Moving the initialization to C is one way among many others, so I don't
think it's a particularly compelling reason.
Stefan
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 23:43 ` Stefan Monnier
@ 2004-11-26 10:29 ` Eli Zaretskii
2004-11-26 14:47 ` Stefan Monnier
0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-26 10:29 UTC (permalink / raw)
Cc: emacs-devel
> Cc: jasonr@gnu.org, emacs-devel@gnu.org
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Thu, 25 Nov 2004 18:43:36 -0500
>
> > Lisp means, e.g., that temacs will have different ideas about HOME
> > etc. than the dumped Emacs, which I think might confuse someone some
>
> Huh? Of course HOME is different before and after the dump.
> How could it be otherwise?
We are emulating a Posix system where HOME's value is something
determined outside Emacs. If you set HOME in init_environment, it
will be the same before and after dumping, as it is on a Posix system,
since init_environment is called unconditionally in the W32 port, and
called very early in the initialization process, way before the Lisp
interpreter is started and any application-level code runs.
The way you suggested to do it, not only will it be different before
and after the dumping, but it also changes its value in the middle of
loadup, because startup.el is loaded after many other Lisp files.
Such a change is unexpected by any reasonable Emacs hacker, and could
cost someone several hours of useless ``debugging'', or even real bugs
if some preloaded Lisp file references HOME's value. Why insist on
doing that when there's a cleaner way? For that matter, is there any
reason at all to favor doing this in Lisp? I don't think I've heard
even a single reason in favor; did I miss something?
> > This change means that we run this code every time getpwuid is called.
>
> Right. Just as we do it on Unix (except on Unix we only do it for HOME
> and not for SHELL).
Unix is a different matter. The W32 port emulates a single user, so
the values are guaranteed to be constant. The right way to impement
such emulations is to use static variables initialized only once.
> > and could be avoided if all the
> > environment frobbing were done in C.
>
> There are many ways to avoid such repetition if it's a problem.
> Moving the initialization to C is one way among many others, so I don't
> think it's a particularly compelling reason.
It's just one of several minor reasons. I never said your suggestion
was a catastrophe, only that there's a slightly better way. But if
what I said, and the fact that Jason also preferred doing that in C,
don't convince you, then probably nothing will; I give up.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 22:46 ` Jason Rumney
@ 2004-11-26 10:32 ` Eli Zaretskii
0 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-26 10:32 UTC (permalink / raw)
Cc: emacs-devel
> From: Jason Rumney <jasonr@gnu.org>
> Date: Thu, 25 Nov 2004 22:46:45 +0000
> Cc: Stefan <monnier@iro.umontreal.ca>, emacs-devel@gnu.org
>
> Line 1055 is where the actual expansion takes place in both cases.
Perhaps I misunderstood what Stefan was asking. I thought he wanted
to know where's the value of emacs_dir pushed into the environment,
not where its value is substitited in the other variables. Sorry if I
misunderstood.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-26 10:29 ` Eli Zaretskii
@ 2004-11-26 14:47 ` Stefan Monnier
2004-11-26 20:50 ` Eli Zaretskii
0 siblings, 1 reply; 35+ messages in thread
From: Stefan Monnier @ 2004-11-26 14:47 UTC (permalink / raw)
Cc: emacs-devel
>> > Lisp means, e.g., that temacs will have different ideas about HOME
>> > etc. than the dumped Emacs, which I think might confuse someone some
>>
>> Huh? Of course HOME is different before and after the dump.
>> How could it be otherwise?
> We are emulating a Posix system where HOME's value is something
> determined outside Emacs. If you set HOME in init_environment, it
> will be the same before and after dumping, as it is on a Posix system,
> since init_environment is called unconditionally in the W32 port, and
> called very early in the initialization process, way before the Lisp
> interpreter is started and any application-level code runs.
Obviously I don't understand what you mean by "before" and "after" dumping.
When I build on my GNU/Linux system, before dump HOME=/u/monnier, and after
dump HOME=/u/fernanda, /u/monnier/, /u/root, /u/guest, ...
> The way you suggested to do it, not only will it be different before
> and after the dumping, but it also changes its value in the middle of
> loadup, because startup.el is loaded after many other Lisp files.
Huh? The code is not run when startup.el is loaded. It's run when we call
normal-top-level.
> Such a change is unexpected by any reasonable Emacs hacker, and could
> cost someone several hours of useless ``debugging'', or even real bugs
> if some preloaded Lisp file references HOME's value.
That would screw up anyone who runs an Emacs he hasn't built himself.
I.e. 99% of the users. I think we'd know about it by now.
> Why insist on doing that when there's a cleaner way? For that matter, is
> there any reason at all to favor doing this in Lisp? I don't think I've
> heard even a single reason in favor; did I miss something?
I find it much easier to write (file-writable-p "~/.emacs"). And I know it
will not dump a core, even if I mess up badly.
>> > This change means that we run this code every time getpwuid is called.
>> Right. Just as we do it on Unix (except on Unix we only do it for HOME
>> and not for SHELL).
> Unix is a different matter. The W32 port emulates a single user, so
> the values are guaranteed to be constant. The right way to impement
> such emulations is to use static variables initialized only once.
This has nothing to do with single-user or not. On Unix we are also
guaranteed that the uid will not change under us while running Emacs.
And yet, everytime we do getpwnam, we rebuilt its value to obey the current
value of $HOME, in case the user changed it with (setenv "HOME" foo).
Read the source.
And BTW, W32 is not very different w.r.t single or multi user. The GUI
makes it difficult to have more than one person logged in at the same time,
but other than that it's basically just the same.
> It's just one of several minor reasons. I never said your suggestion
> was a catastrophe, only that there's a slightly better way. But if
> what I said, and the fact that Jason also preferred doing that in C,
> don't convince you, then probably nothing will; I give up.
My opinion is that something should be done in C only if it can't be done in
elisp, or if it's inconvenient to do it in elisp, or if doing it in elisp is
too costly performancewise.
I don't think any of those 3 cases applies here.
Stefan
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-26 14:47 ` Stefan Monnier
@ 2004-11-26 20:50 ` Eli Zaretskii
2004-11-26 22:03 ` Stefan Monnier
0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-26 20:50 UTC (permalink / raw)
Cc: emacs-devel
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Fri, 26 Nov 2004 09:47:50 -0500
> Cc: emacs-devel@gnu.org
>
> Obviously I don't understand what you mean by "before" and "after" dumping.
> When I build on my GNU/Linux system, before dump HOME=/u/monnier, and after
> dump HOME=/u/fernanda, /u/monnier/, /u/root, /u/guest, ...
On the same system as the one where it was dumped and when invoked by
the same user, it will stay /u/monnier/.
> Huh? The code is not run when startup.el is loaded. It's run when we call
> normal-top-level.
Right, so with your suggestion, it will get its final correct value
even later than I erroneously wrote.
> That would screw up anyone who runs an Emacs he hasn't built himself.
> I.e. 99% of the users. I think we'd know about it by now.
You lost me here: on a Posix system, the value of HOME known to Emacs
does not change in the midst of the session startup. It is set
outside of Emacs and never changes during the Emacs session.
So such changes are never experienced by Emacs users on Posix systems.
> > Why insist on doing that when there's a cleaner way? For that matter, is
> > there any reason at all to favor doing this in Lisp? I don't think I've
> > heard even a single reason in favor; did I miss something?
>
> I find it much easier to write (file-writable-p "~/.emacs"). And I know it
> will not dump a core, even if I mess up badly.
So don't mess it up.
> >> > This change means that we run this code every time getpwuid is called.
> >> Right. Just as we do it on Unix (except on Unix we only do it for HOME
> >> and not for SHELL).
> > Unix is a different matter. The W32 port emulates a single user, so
> > the values are guaranteed to be constant. The right way to impement
> > such emulations is to use static variables initialized only once.
>
> This has nothing to do with single-user or not. On Unix we are also
> guaranteed that the uid will not change under us while running Emacs.
> And yet, everytime we do getpwnam, we rebuilt its value to obey the current
> value of $HOME, in case the user changed it with (setenv "HOME" foo).
> Read the source.
Wait a minute, I always thought setenv only modifies the value of the
variable for the subprocesses, not the value seen by Emacs. It
modifies process-environment, but does not call setenv or putenv in C
to modify the environment of the Emacs process, right? So (setenv
"HOME" foo) should not matter for the value of pw_dir, right?
Hmm... that probably means that, since your suggestion is based on
using setenv, it is not going to work, i.e. it will not change the
value of HOME as known to Emacs itself. Am I missing something?
> And BTW, W32 is not very different w.r.t single or multi user. The GUI
> makes it difficult to have more than one person logged in at the same time,
> but other than that it's basically just the same.
Not as far as getpwuid is concerned: the code is written to support
only one user ID: the one we saw at Emacs startup. Read the source.
> My opinion is that something should be done in C only if it can't be done in
> elisp, or if it's inconvenient to do it in elisp, or if doing it in elisp is
> too costly performancewise.
There's at least one other situation where a C implementation is
appropriate: when things should be done as early in the Emacs startup
process as possible, because they might affect the later parts,
i.e. some of the init_* functions. In the case in point, we need to
set HOME very early, because the C part of the session initialization
needs to see the same value of HOME as the Lisp code and all the rest
of the session will. This is so because we want to pretend that the
value of HOME came from outside Emacs.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-25 21:45 ` Eli Zaretskii
@ 2004-11-26 20:56 ` Eli Zaretskii
2004-11-26 23:42 ` Andreas Schwab
0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-26 20:56 UTC (permalink / raw)
> Date: Thu, 25 Nov 2004 23:45:18 +0200
> From: "Eli Zaretskii" <eliz@gnu.org>
> Cc: jasonr@gnu.org, emacs-devel@gnu.org
>
> > From: Stefan <monnier@iro.umontreal.ca>
> > Date: Thu, 25 Nov 2004 12:45:48 -0500
> > Cc: emacs-devel@gnu.org, Jason Rumney <jasonr@gnu.org>
> >
> > >> + /* Set dir and shell from environment variables. */
> > >> + strcpy (the_passwd.pw_dir, getenv ("HOME"));
> >
> > > What if strlen (getenv ("HOME")) >= sizeof (the_passwd.pw_dir)?
> >
> > Well, tough!
> > This code is not new: it's just moved from one place to another so it's not
> > a new problem.
>
> Can you (or someone else) look at the w32 system headers and see how
> struct passwd is defined there?
Silly me: it's defined on w32.c, right there. The pw_dir etc. struct
members are defined as fixed-size strings, and the sizes are all 256
bytes, including the terminating null. So I think, at least that
should be changed to 261, since the longest file name supported by
Windows is 260 characters.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-26 20:50 ` Eli Zaretskii
@ 2004-11-26 22:03 ` Stefan Monnier
2004-11-27 11:36 ` Eli Zaretskii
0 siblings, 1 reply; 35+ messages in thread
From: Stefan Monnier @ 2004-11-26 22:03 UTC (permalink / raw)
Cc: emacs-devel
>> Obviously I don't understand what you mean by "before" and "after" dumping.
>> When I build on my GNU/Linux system, before dump HOME=/u/monnier, and after
>> dump HOME=/u/fernanda, /u/monnier/, /u/root, /u/guest, ...
> On the same system as the one where it was dumped and when invoked by
> the same user, it will stay /u/monnier/.
Not necessarily. My HOME dir might get moved at some point.
>> That would screw up anyone who runs an Emacs he hasn't built himself.
>> I.e. 99% of the users. I think we'd know about it by now.
> You lost me here: on a Posix system, the value of HOME known to Emacs
> does not change in the midst of the session startup. It is set
> outside of Emacs and never changes during the Emacs session.
No: *you* lost me here. Of course HOME typically never changes during
a session. But you were talking about "before dumping" and "after dumping",
which is a whole other kettle of fish.
> So such changes are never experienced by Emacs users on Posix systems.
Probably. I'm pretty sure I tried to change HOME in a running Emacs
a couple times (I change my HOME like that occasionally to try and confine
some operations to a particular subdir, or to get a program to ignore (and
to not change) my config), but I must admit that I can't remember how it
affected this Emacs session.
>> This has nothing to do with single-user or not. On Unix we are also
>> guaranteed that the uid will not change under us while running Emacs.
>> And yet, everytime we do getpwnam, we rebuilt its value to obey the current
>> value of $HOME, in case the user changed it with (setenv "HOME" foo).
>> Read the source.
> Wait a minute, I always thought setenv only modifies the value of the
> variable for the subprocesses, not the value seen by Emacs.
Sorry I got confused, that's in the VMS-only code.
> It modifies process-environment, but does not call setenv or putenv in
> C to modify the environment of the Emacs process, right? So (setenv
> "HOME" foo) should not matter for the value of pw_dir, right?
> Hmm... that probably means that, since your suggestion is based on
> using setenv, it is not going to work, i.e. it will not change the
> value of HOME as known to Emacs itself. Am I missing something?
You might be completely right. As I said it sucks to develop blindfolded.
So if someone could actually try the fucking damn patch and help me fix it
instead of waste my time about details, ...
Or even write a counter patch.
>> And BTW, W32 is not very different w.r.t single or multi user. The GUI
>> makes it difficult to have more than one person logged in at the same time,
>> but other than that it's basically just the same.
> Not as far as getpwuid is concerned: the code is written to support
> only one user ID: the one we saw at Emacs startup. Read the source.
That's not what I meant. I meant that 2 users can use the same Emacs
executable (tho in two different processes), just as under Unix.
The lack of support for "other uid" has only minimal impact: basically it
prevents ~<user> from working and that's about it. Big deal.
> i.e. some of the init_* functions. In the case in point, we need to
> set HOME very early, because the C part of the session initialization
> needs to see the same value of HOME as the Lisp code and all the rest
> of the session will.
Why would it matter?
Here's a sample session under GNU/Linux.
% (unset HOME; emacs)
M-x ielm
*** Welcome to IELM *** Type (describe-mode) for help.
ELISP> (expand-file-name "~/")
"/"
ELISP> (setenv "HOME" "/u/monnier")
"/u/monnier"
ELISP> (expand-file-name "~/")
"/u/monnier/"
ELISP>
HOME is not nearly as important as you'd think. The only place where it is
needed before reading .emacs seems to be in order to read ~/.Xresources and
~/.Xauthority (although I'd argue that we should only open the X display
after reading the .emacs file).
Anyway, feel free to provide an alternative patch.
Stefan
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-26 20:56 ` Eli Zaretskii
@ 2004-11-26 23:42 ` Andreas Schwab
2004-11-27 9:33 ` Eli Zaretskii
0 siblings, 1 reply; 35+ messages in thread
From: Andreas Schwab @ 2004-11-26 23:42 UTC (permalink / raw)
Cc: emacs-devel, monnier, jasonr
"Eli Zaretskii" <eliz@gnu.org> writes:
> Silly me: it's defined on w32.c, right there. The pw_dir etc. struct
> members are defined as fixed-size strings, and the sizes are all 256
> bytes, including the terminating null. So I think, at least that
> should be changed to 261, since the longest file name supported by
> Windows is 260 characters.
Any fixed length would be wrong, IMHO. Can't this just be dynamically
allocated?
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-26 23:42 ` Andreas Schwab
@ 2004-11-27 9:33 ` Eli Zaretskii
2004-11-27 13:26 ` Andreas Schwab
0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-27 9:33 UTC (permalink / raw)
Cc: emacs-devel, jasonr
> Cc: monnier@iro.umontreal.ca, jasonr@gnu.org, emacs-devel@gnu.org
> From: Andreas Schwab <schwab@suse.de>
> Date: Sat, 27 Nov 2004 00:42:07 +0100
>
> Any fixed length would be wrong, IMHO. Can't this just be dynamically
> allocated?
Any _arbitrary_ fixed length is wrong. But if the filesystem supports
at most FILENAME_MAX-long file names, then using FILENAME_MAX for
strings that hold file names is not arbitrary. Likewise, if we know
what is the maximum length of a Windows user name, we could use that
value as the size of the pw_name member.
But using strdup would also be okay, IMHO, and would avoid the need
for looking up the OS limits for each member.
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-26 22:03 ` Stefan Monnier
@ 2004-11-27 11:36 ` Eli Zaretskii
0 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-27 11:36 UTC (permalink / raw)
Cc: emacs-devel
> Cc: emacs-devel@gnu.org
> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Fri, 26 Nov 2004 17:03:51 -0500
>
> > On the same system as the one where it was dumped and when invoked by
> > the same user, it will stay /u/monnier/.
>
> Not necessarily. My HOME dir might get moved at some point.
Yes, but that's hardly a common situation, let alone something you
expect to be done behind your back.
> No: *you* lost me here. Of course HOME typically never changes during
> a session. But you were talking about "before dumping" and "after dumping",
> which is a whole other kettle of fish.
I was thinking about an Emacs developer who debugs temacs and/or
dumped emacs on the same machine and under the same user name. Having
HOME with different values in each case is an unexpected subtlety in
such a situation.
> > i.e. some of the init_* functions. In the case in point, we need to
> > set HOME very early, because the C part of the session initialization
> > needs to see the same value of HOME as the Lisp code and all the rest
> > of the session will.
>
> Why would it matter?
It _could_ matter; I didn't check that the current sources actually
reference $HOME in the initialization code. But they most certainly
could, and I think we need to come up with a method of setting $HOME
that has the least probability of introducing a bug if the
initialization code ever references the value of HOME. Setting its
value as close as possible to the first line of `main' comes closer to
achieving this goal than doing it as part of top-level.
> Anyway, feel free to provide an alternative patch.
Below. It's also untested (I don't have a working Windows development
environment to try it), so caveat emptor.
If the patch is accepted, there are a few issues with this patch that
I think need to be discussed:
. Use of R_OK to probe .emacs usability. The code as written does
what Stefan's Lisp implementation did, but I'm not sure it is
correct to settle for .emacs being readable. Shouldn't we check if
it is writable? Suppose that C:/.emacs exists, but is from another
user of the same system, for example.
. Use of W_OK to probe whether a directory is usable. On Windows,
the read-only bit of a directory does not prevent a user from
creating files in that directory. So it might be enough to check
for D_OK alone.
. The exact environment variables to check. I think I saw HOMEDRIVE
and HOMEPATH spelled on Windows XP as HomeDrive and HomePath. If
the Windows' version of `getenv' is case-sensitive, the code below
should try both spellings.
--- emacs/src/w32.c~ 2004-10-23 23:04:50.000000000 +0200
+++ emacs/src/w32.c 2004-11-27 13:35:14.000000000 +0200
@@ -371,8 +371,8 @@ getloadavg (double loadavg[], int nelem)
static char the_passwd_name[PASSWD_FIELD_SIZE];
static char the_passwd_passwd[PASSWD_FIELD_SIZE];
static char the_passwd_gecos[PASSWD_FIELD_SIZE];
-static char the_passwd_dir[PASSWD_FIELD_SIZE];
-static char the_passwd_shell[PASSWD_FIELD_SIZE];
+static char the_passwd_dir[MAX_PATH];
+static char the_passwd_shell[MAX_PATH];
static struct passwd the_passwd =
{
@@ -896,6 +896,7 @@ w32_get_resource (key, lpdwtype)
char *get_emacs_configuration (void);
extern Lisp_Object Vsystem_configuration;
+int sys_access (const char *, int);
void
init_environment (char ** argv)
@@ -1033,6 +1034,39 @@ init_environment (char ** argv)
}
}
+ /* Compute the default value for HOME. Maintain compatibility
+ with previous setup of defaulting to C:/ if there's already a
+ usable .emacs in there. */
+ if (sys_access ("C:/.emacs", R_OK) != 0
+ && sys_access ("C:/_emacs", R_OK) != 0)
+ {
+ char *userprofile = getenv ("USERPROFILE");
+ char *homepath = getenv ("HOMEPATH");
+ char *homedrive = getenv ("HOMEDRIVE");
+
+ for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++)
+ {
+ if (strcmp (env_vars[i].name, "HOME") == 0)
+ break;
+ }
+
+ /* Default to %USERPROFILE% if set and accessible, otherwise
+ to %HOMEDRIVE%/%HOMEPATH%. The former is set on W2K, XP,
+ and later systems, the latter on Windows NT; Windows 9X
+ doesn't set either. */
+ if (userprofile && sys_access (userprofile, D_OK | W_OK) == 0)
+ env_vars[i].def_value = strdup (userprofile);
+ else if (homedrive && homepath)
+ {
+ char homedir[MAX_PATH];
+
+ strcat (strcpy (homedir, homedrive), homepath);
+ if (sys_access (homedir, D_OK | W_OK) == 0)
+ env_vars[i].def_value = strdup (homedir);
+ }
+ }
+
+ /* Now handle the entire list of env_vars[]. */
for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++)
{
if (!getenv (env_vars[i].name))
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-27 9:33 ` Eli Zaretskii
@ 2004-11-27 13:26 ` Andreas Schwab
2004-11-27 16:40 ` Eli Zaretskii
0 siblings, 1 reply; 35+ messages in thread
From: Andreas Schwab @ 2004-11-27 13:26 UTC (permalink / raw)
Cc: emacs-devel, jasonr
"Eli Zaretskii" <eliz@gnu.org> writes:
>> Cc: monnier@iro.umontreal.ca, jasonr@gnu.org, emacs-devel@gnu.org
>> From: Andreas Schwab <schwab@suse.de>
>> Date: Sat, 27 Nov 2004 00:42:07 +0100
>>
>> Any fixed length would be wrong, IMHO. Can't this just be dynamically
>> allocated?
>
> Any _arbitrary_ fixed length is wrong. But if the filesystem supports
> at most FILENAME_MAX-long file names, then using FILENAME_MAX for
> strings that hold file names is not arbitrary.
What if someone sets HOME to something longer? It won't work as filename,
sure, but Emacs should not crash just because of this.
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-27 13:26 ` Andreas Schwab
@ 2004-11-27 16:40 ` Eli Zaretskii
2004-11-27 17:46 ` Andreas Schwab
0 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2004-11-27 16:40 UTC (permalink / raw)
Cc: emacs-devel, jasonr
> Cc: jasonr@gnu.org, emacs-devel@gnu.org
> From: Andreas Schwab <schwab@suse.de>
> Date: Sat, 27 Nov 2004 14:26:36 +0100
>
> What if someone sets HOME to something longer? It won't work as filename,
> sure, but Emacs should not crash just because of this.
Right, so let's use strncpy to avoid the crash in that case. Would
that be an okay solution?
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-27 16:40 ` Eli Zaretskii
@ 2004-11-27 17:46 ` Andreas Schwab
0 siblings, 0 replies; 35+ messages in thread
From: Andreas Schwab @ 2004-11-27 17:46 UTC (permalink / raw)
Cc: emacs-devel, jasonr
"Eli Zaretskii" <eliz@gnu.org> writes:
> Right, so let's use strncpy to avoid the crash in that case. Would
> that be an okay solution?
I'm ok with anything that doesn't result in buffer overflows.
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 35+ messages in thread
* Re: $USERPROFILE for $HOME on W32
2004-11-22 8:44 ` Jason Rumney
2004-11-22 13:04 ` Stefan Monnier
2004-11-25 16:00 ` Stefan Monnier
@ 2004-12-06 23:17 ` Lennart Borgman
2 siblings, 0 replies; 35+ messages in thread
From: Lennart Borgman @ 2004-12-06 23:17 UTC (permalink / raw)
Cc: emacs-devel
It seems to be hard to get a decision at the moment, but I hope it will be
cleared out. Could this please be put in FOR-RELEASE? Or, could Stephans
patch be tested? (I am unfortunately not the one to do this for several
reasons.)
- Lennart
----- Original Message -----
From: "Jason Rumney" <jasonr@gnu.org>
To: "Stefan Monnier" <monnier@iro.umontreal.ca>
Cc: <emacs-devel@gnu.org>
Sent: Monday, November 22, 2004 9:44 AM
Subject: Re: $USERPROFILE for $HOME on W32
> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>
> > To follow up on the thread, here is a suggested patch.
> > Any objection?
>
> I'd rather put the code in init_environment() in w32.c, and keep all
> hacking of environment variables in one place.
^ permalink raw reply [flat|nested] 35+ messages in thread
end of thread, other threads:[~2004-12-06 23:17 UTC | newest]
Thread overview: 35+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-11-22 6:26 $USERPROFILE for $HOME on W32 Stefan Monnier
2004-11-22 8:44 ` Jason Rumney
2004-11-22 13:04 ` Stefan Monnier
2004-11-25 16:00 ` Stefan Monnier
2004-11-25 16:34 ` Jason Rumney
2004-11-25 16:54 ` Stefan
2004-11-25 21:52 ` Eli Zaretskii
2004-11-25 22:46 ` Jason Rumney
2004-11-26 10:32 ` Eli Zaretskii
2004-11-25 16:57 ` Andreas Schwab
2004-11-25 17:45 ` Stefan
2004-11-25 17:49 ` Andreas Schwab
2004-11-25 21:45 ` Eli Zaretskii
2004-11-26 20:56 ` Eli Zaretskii
2004-11-26 23:42 ` Andreas Schwab
2004-11-27 9:33 ` Eli Zaretskii
2004-11-27 13:26 ` Andreas Schwab
2004-11-27 16:40 ` Eli Zaretskii
2004-11-27 17:46 ` Andreas Schwab
2004-11-25 22:04 ` Eli Zaretskii
2004-11-25 23:43 ` Stefan Monnier
2004-11-26 10:29 ` Eli Zaretskii
2004-11-26 14:47 ` Stefan Monnier
2004-11-26 20:50 ` Eli Zaretskii
2004-11-26 22:03 ` Stefan Monnier
2004-11-27 11:36 ` Eli Zaretskii
2004-12-06 23:17 ` Lennart Borgman
2004-11-22 15:46 ` Eli Zaretskii
2004-11-22 16:47 ` Stefan Monnier
2004-11-23 11:49 ` Eli Zaretskii
2004-11-23 8:30 ` Jason Rumney
2004-11-23 11:32 ` Eli Zaretskii
2004-11-23 20:47 ` Jason Rumney
2004-11-23 20:57 ` Eli Zaretskii
2004-11-24 8:17 ` John Paul Wallington
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).