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 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'Src/builtin.c') 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))) { -- cgit 1.4.1