diff options
author | jilles <jilles@FreeBSD.org> | 2011-05-20 22:55:18 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2011-05-20 22:55:18 +0000 |
commit | 8c45da6d46639aaf96d62dfaeda1511092a07ee0 (patch) | |
tree | 2b9c2b64063550fe3099663eac19df6a627b0bf0 /tools | |
parent | b1c7404a29cca0fe879d99c3022eef64cb1a8017 (diff) | |
download | FreeBSD-src-8c45da6d46639aaf96d62dfaeda1511092a07ee0.zip FreeBSD-src-8c45da6d46639aaf96d62dfaeda1511092a07ee0.tar.gz |
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.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/regression/bin/sh/builtins/cd3.0 | 21 | ||||
-rw-r--r-- | tools/regression/bin/sh/builtins/cd4.0 | 38 |
2 files changed, 59 insertions, 0 deletions
diff --git a/tools/regression/bin/sh/builtins/cd3.0 b/tools/regression/bin/sh/builtins/cd3.0 new file mode 100644 index 0000000..7729c54 --- /dev/null +++ b/tools/regression/bin/sh/builtins/cd3.0 @@ -0,0 +1,21 @@ +# $FreeBSD$ + +# If fully successful, cd -Pe must be like cd -P. + +set -e + +cd "${TMPDIR:-/tmp}" +cd -Pe / +[ "$PWD" = / ] +[ "$(pwd)" = / ] +cd "${TMPDIR:-/tmp}" +cd -eP / +[ "$PWD" = / ] +[ "$(pwd)" = / ] + +set +e + +# If cd -Pe cannot chdir, the exit status must be greater than 1. + +v=$( (cd -Pe /var/empty/nonexistent) 2>&1 >/dev/null) +[ $? -gt 1 ] && [ -n "$v" ] diff --git a/tools/regression/bin/sh/builtins/cd4.0 b/tools/regression/bin/sh/builtins/cd4.0 new file mode 100644 index 0000000..df3a9a4 --- /dev/null +++ b/tools/regression/bin/sh/builtins/cd4.0 @@ -0,0 +1,38 @@ +# $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 |