about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2009-07-19 19:07:14 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2009-07-19 19:07:14 +0000
commit606cfb5a5e65c80d88fc90169200cea404c16796 (patch)
tree3912e7287610f77fd37c21fafc2ba6563aacb549 /Src
parent0b8d247f6b433231e26d5930a2ff8d737f424e61 (diff)
downloadzsh-606cfb5a5e65c80d88fc90169200cea404c16796.tar.gz
zsh-606cfb5a5e65c80d88fc90169200cea404c16796.tar.xz
zsh-606cfb5a5e65c80d88fc90169200cea404c16796.zip
27167: add POSIX_CD option to test "." after CDPATH
Diffstat (limited to 'Src')
-rw-r--r--Src/builtin.c28
-rw-r--r--Src/options.c1
-rw-r--r--Src/zsh.h1
3 files changed, 25 insertions, 5 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 162e7c254..dc39b2a7f 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -945,14 +945,23 @@ cd_do_chdir(char *cnam, char *dest, int hard)
 	return NULL;
     }
 
-    /* if cdpath is being used, check it for . */
-    if (!nocdpath)
+    /*
+     * If cdpath is being used, check it for ".".
+     * Don't bother doing this if POSIXCD is set, we don't
+     * need to know (though it doesn't actually matter).
+     */
+    if (!nocdpath && !isset(POSIXCD))
 	for (pp = cdpath; *pp; pp++)
 	    if (!(*pp)[0] || ((*pp)[0] == '.' && (*pp)[1] == '\0'))
 		hasdot = 1;
-    /* if there is no . in cdpath (or it is not being used), try the directory
-       as-is (i.e. from .) */
-    if (!hasdot) {
+    /*
+     * If 
+     * (- there is no . in cdpath
+     *  - or cdpath is not being used)
+     *  - and the POSIXCD option is not set
+     * try the directory as-is (i.e. from .)
+     */
+    if (!hasdot && !isset(POSIXCD)) {
 	if ((ret = cd_try_chdir(NULL, dest, hard)))
 	    return ret;
 	if (errno != ENOENT)
@@ -971,6 +980,15 @@ cd_do_chdir(char *cnam, char *dest, int hard)
 	    if (errno != ENOENT)
 		eno = errno;
 	}
+    /*
+     * POSIX requires us to check "." after CDPATH rather than before.
+     */
+    if (isset(POSIXCD)) {
+	if ((ret = cd_try_chdir(NULL, dest, hard)))
+	    return ret;
+	if (errno != ENOENT)
+	    eno = errno;
+    }
 
     /* handle the CDABLEVARS option */
     if ((ret = cd_able_vars(dest))) {
diff --git a/Src/options.c b/Src/options.c
index 8e5308c0b..c5b7c3b8f 100644
--- a/Src/options.c
+++ b/Src/options.c
@@ -200,6 +200,7 @@ static struct optname optns[] = {
 {{NULL, "pathdirs",	      OPT_EMULATE},		 PATHDIRS},
 {{NULL, "posixaliases",       OPT_EMULATE|OPT_BOURNE},	 POSIXALIASES},
 {{NULL, "posixbuiltins",      OPT_EMULATE|OPT_BOURNE},	 POSIXBUILTINS},
+{{NULL, "posixcd",            OPT_EMULATE|OPT_BOURNE},	 POSIXCD},
 {{NULL, "posixidentifiers",   OPT_EMULATE|OPT_BOURNE},	 POSIXIDENTIFIERS},
 {{NULL, "posixjobs",          OPT_EMULATE|OPT_BOURNE},	 POSIXJOBS},
 {{NULL, "printeightbit",      0},                        PRINTEIGHTBIT},
diff --git a/Src/zsh.h b/Src/zsh.h
index a230a5058..060f8a6d4 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1966,6 +1966,7 @@ enum {
     PATHDIRS,
     POSIXALIASES,
     POSIXBUILTINS,
+    POSIXCD,
     POSIXIDENTIFIERS,
     POSIXJOBS,
     PRINTEIGHTBIT,