about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2006-02-07 11:29:30 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2006-02-07 11:29:30 +0000
commit30176eaf635a61d77114f5e834ed0684ea7dac05 (patch)
tree344141169d7c46c58a5c74bca2b81d17862fd0ac
parent90b6199e17c437408192966a3ff8266db9a4b1c2 (diff)
downloadzsh-30176eaf635a61d77114f5e834ed0684ea7dac05.tar.gz
zsh-30176eaf635a61d77114f5e834ed0684ea7dac05.tar.xz
zsh-30176eaf635a61d77114f5e834ed0684ea7dac05.zip
22198: do always set HOME in native emulation
-rw-r--r--ChangeLog7
-rw-r--r--Doc/Zsh/params.yo5
-rw-r--r--README5
-rw-r--r--Src/init.c19
-rw-r--r--Src/params.c11
5 files changed, 38 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 9cd80ccd1..e201d7f82 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-02-07  Peter Stephenson  <pws@csr.com>
+
+	* 22198: README, Src/init.c, Src/params.c, Doc/Zsh/params.yo:
+	modify 22195 so that HOME gets set as before in native emulation.
+
 2006-02-06  Wayne Davison  <wayned@users.sourceforge.net>
 
 	* unposted: Src/Modules/newuser.c: fixed return-without-value
@@ -5,7 +10,7 @@
 
 2006-02-06  Peter Stephenson  <pws@csr.com>
 
-	* 22196: INSTALL, README, Config/version.mk: developement
+	* 22196: INSTALL, README, Config/version.mk: development
 	version 4.3.0-dev-3
 
 	* 22195: README, Src/init.c, Src/params.c, Src/subst.c,
diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo
index 7999d297b..a91e99fbd 100644
--- a/Doc/Zsh/params.yo
+++ b/Doc/Zsh/params.yo
@@ -805,7 +805,10 @@ cushion for saving duplicated history events.
 )
 vindex(HOME)
 item(tt(HOME) <S>)(
-The default argument for the tt(cd) command.
+The default argument for the tt(cd) command.  This is not set automatically
+by the shell in tt(sh), tt(ksh) or tt(csh) emulation, but it is typically
+present in the environment anyway, and if it becomes set it has its usual
+special behaviour.
 )
 vindex(IFS)
 item(tt(IFS) <S>)(
diff --git a/README b/README
index 804d982b1..84a00706f 100644
--- a/README
+++ b/README
@@ -31,8 +31,9 @@ variables as an error, so can still return status 0 (depending on the
 handling of other arguments).  This appears to be the standard shell
 behaviour.
 
-The variable HOME is no longer set by the shell; it must be present
-in the environment.  It is valid for the variable to be unset.
+The variable HOME is no longer set by the shell if zsh is emulating any
+other shell at startup; it must be present in the environment or set
+subsequently by the user.  It is valid for the variable to be unset.
 
 Zsh has previously been lax about whether it allows octets with the
 top bit set to be part of a shell identifier.  With --enable-multibyte set,
diff --git a/Src/init.c b/Src/init.c
index adb6eb84a..ac04a90e2 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -798,19 +798,28 @@ setupvals(void)
     /* Get password entry and set info for `USERNAME' */
 #ifdef HAVE_GETPWUID
     if ((pswd = getpwuid(cached_uid))) {
+	if (emulation == EMULATE_ZSH)
+	    home = metafy(pswd->pw_dir, -1, META_DUP);
 	cached_username = ztrdup(pswd->pw_name);
-    } else
+    }
+    else
 #endif /* HAVE_GETPWUID */
-	   {
+    {
+	if (emulation == EMULATE_ZSH)
+	    home = ztrdup("/");
 	cached_username = ztrdup("");
     }
 
     /*
      * Try a cheap test to see if we can initialize `PWD' from `HOME'.
-     * HOME must come from the environment; we're not allowed to
-     * set it locally.
+     * In non-native emulations HOME must come from the environment;
+     * we're not allowed to set it locally.
      */
-    if ((ptr = getenv("HOME")) && ispwd(ptr))
+    if (emulation == EMULATE_ZSH)
+	ptr = home;
+    else
+	ptr = getenv("HOME");
+    if (ptr && ispwd(ptr))
 	pwd = ztrdup(ptr);
     else if ((ptr = zgetenv("PWD")) && (strlen(ptr) < PATH_MAX) &&
 	     (ptr = metafy(ptr, -1, META_STATIC), ispwd(ptr)))
diff --git a/Src/params.c b/Src/params.c
index 5e4231cac..a633fb579 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -690,6 +690,17 @@ createparamtable(void)
     *envp = '\0';
     opts[ALLEXPORT] = oae;
 
+    if (emulation == EMULATE_ZSH)
+    {
+	/*
+	 * For native emulation we always set the variable home
+	 * (see setupvals()).
+	 */
+	pm = (Param) paramtab->getnode(paramtab, "HOME");
+	pm->flags &= ~PM_UNSET;
+	if (!(pm->flags & PM_EXPORTED))
+	    addenv(pm, home);
+    }
     pm = (Param) paramtab->getnode(paramtab, "LOGNAME");
     if (!(pm->flags & PM_EXPORTED))
 	addenv(pm, pm->u.str);