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
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to