opnsense-src/tools/regression/bin/sh/builtins/cd4.0
Jilles Tjoelker d6ee26ad02 sh: Implement the cd -e flag proposed for the next POSIX issue.
This reflects failure to determine the pathname of the new directory in the
exit status (1). Normally, cd returns successfully if it did chdir() and the
call was successful.

In POSIX, -e only has meaning with -P; because our -L is not entirely
compliant and may fall back to -P mode, -e has some effect with -L as well.
2011-05-20 22:55:18 +00:00

38 lines
1,016 B
Text

# $FreeBSD$
# This test assumes that whatever mechanism cd -P uses to determine the
# pathname to the current directory if it is longer than PATH_MAX requires
# read permission on all parent directories. It also works if this
# requirement always applies.
set -e
L=$(getconf PATH_MAX / 2>/dev/null) || L=4096
[ "$L" -lt 100000 ] 2>/dev/null || L=4096
L=$((L+100))
T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
trap 'chmod u+r ${T}; rm -rf ${T}' 0
cd -Pe $T
D=$(pwd)
chmod u-r "$D"
if [ -r "$D" ]; then
# Running as root, cannot test.
exit 0
fi
set +e
while [ ${#D} -lt $L ]; do
mkdir veryverylongdirectoryname || exit
cd -Pe veryverylongdirectoryname 2>/dev/null
r=$?
[ $r -gt 1 ] && exit $r
if [ $r -eq 1 ]; then
# Verify that the directory was changed correctly.
cd -Pe .. || exit
[ "$(pwd)" = "$D" ] || exit
# Verify that omitting -e results in success.
cd -P veryverylongdirectoryname 2>/dev/null || exit
exit 0
fi
D=$D/veryverylongdirectoryname
done
echo "cd -Pe never returned 1"
exit 0