sh: Properly show "Not a directory" error in cd builtin.

The errno message display added in r222292 did not take attempting to
cd to a non-directory or something that cannot be stat()ed into account.

PR:		bin/164070
MFC after:	10 days
This commit is contained in:
Jilles Tjoelker 2012-01-13 23:32:27 +00:00
parent 547cfad16d
commit e94e3511bd
2 changed files with 32 additions and 1 deletions

View File

@ -130,7 +130,12 @@ cdcmd(int argc, char **argv)
(path = bltinlookup("CDPATH", 1)) == NULL)
path = nullstr;
while ((p = padvance(&path, dest)) != NULL) {
if (stat(p, &statb) >= 0 && S_ISDIR(statb.st_mode)) {
if (stat(p, &statb) < 0) {
if (errno != ENOENT)
errno1 = errno;
} else if (!S_ISDIR(statb.st_mode))
errno1 = ENOTDIR;
else {
if (!print) {
/*
* XXX - rethink

View File

@ -0,0 +1,26 @@
# $FreeBSD$
# The exact wording of the error message is not standardized, but giving
# a description of the errno is useful.
LC_ALL=C
export LC_ALL
r=0
t() {
exec 3>&1
errmsg=`cd "$1" 2>&1 >&3 3>&-`
exec 3>&-
case $errmsg in
*[Nn]ot\ a\ directory*)
;;
*)
printf "Wrong error message for %s: %s\n" "$1" "$errmsg"
r=3
;;
esac
}
t /dev/tty
t /dev/tty/x
exit $r