Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 23 Jan 2016 23:00:38 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r294649 - head/bin/sh
Message-ID:  <201601232300.u0NN0cHd090950@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201601232300.u0NN0cHd090950>