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