svn commit: r294649 - head/bin/sh
Jilles Tjoelker
jilles at FreeBSD.org
Sat Jan 23 23:00:40 UTC 2016
Author: jilles
Date: Sat Jan 23 23:00:38 2016
New Revision: 294649
URL: https://svnweb.freebsd.org/changeset/base/294649
Log:
sh: Use OLDPWD shell variable for 'cd -'.
Per POSIX, 'cd -' should use the OLDPWD shell variable, not internal state.
This variable is normally exported.
Also, if OLDPWD is not set, fail 'cd -' instead of changing to the current
directory.
Modified:
head/bin/sh/cd.c
Modified: head/bin/sh/cd.c
==============================================================================
--- head/bin/sh/cd.c Sat Jan 23 22:56:26 2016 (r294648)
+++ head/bin/sh/cd.c Sat Jan 23 23:00:38 2016 (r294649)
@@ -75,7 +75,6 @@ static char *getpwd(void);
static char *getpwd2(void);
static char *curdir = NULL; /* current working directory */
-static char *prevdir; /* previous working directory */
static char *cdcomppath;
int
@@ -112,11 +111,10 @@ cdcmd(int argc __unused, char **argv __u
if (*dest == '\0')
dest = ".";
if (dest[0] == '-' && dest[1] == '\0') {
- dest = prevdir ? prevdir : curdir;
- if (dest)
- print = 1;
- else
- dest = ".";
+ dest = bltinlookup("OLDPWD", 1);
+ if (dest == NULL)
+ error("OLDPWD not set");
+ print = 1;
}
if (dest[0] == '/' ||
(dest[0] == '.' && (dest[1] == '/' || dest[1] == '\0')) ||
@@ -311,14 +309,15 @@ findcwd(char *dir)
static void
updatepwd(char *dir)
{
+ char *prevdir;
+
hashcd(); /* update command hash table */
- if (prevdir)
- ckfree(prevdir);
+ setvar("PWD", dir, VEXPORT);
+ setvar("OLDPWD", curdir, VEXPORT);
prevdir = curdir;
curdir = dir ? savestr(dir) : NULL;
- setvar("PWD", curdir, VEXPORT);
- setvar("OLDPWD", prevdir, VEXPORT);
+ ckfree(prevdir);
}
int
More information about the svn-src-all
mailing list