From 606cfb5a5e65c80d88fc90169200cea404c16796 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 19 Jul 2009 19:07:14 +0000 Subject: 27167: add POSIX_CD option to test "." after CDPATH --- Src/builtin.c | 28 +++++++++++++++++++++++----- Src/options.c | 1 + Src/zsh.h | 1 + 3 files changed, 25 insertions(+), 5 deletions(-) (limited to 'Src') 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, -- cgit 1.4.1