######################################################################## # # # This software is part of the ast package # # Copyright (c) 1982-2010 AT&T Intellectual Property # # and is licensed under the # # Common Public License, Version 1.0 # # by AT&T Intellectual Property # # # # A copy of the License is available at # # http://www.opensource.org/licenses/cpl1.0.txt # # (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # # # # Information and Software Systems Research # # AT&T Research # # Florham Park NJ # # # # David Korn # # # ######################################################################## proc err_exit { print -u2 -n "\t" print -u2 -r ${Command}[$1]: ${@:2} let Errors+=1 } alias err_exit='err_exit $LINENO' setvar Command = ${0##*/} integer Errors=0 setvar tmp = $(mktemp -dt) || do { err_exit mktemp -dt failed; exit 1; } trap "cd /; rm -rf $tmp" EXIT proc abspath { setvar base = $(basename $SHELL) cd ${SHELL%/$base} setvar newdir = $(pwd) cd ~- print $newdir/$base } #test for proper exit of shell builtin getconf setvar ABSHELL = $(abspath) cd $tmp || do { err_exit "cd $tmp failed"; exit 1; } print exit 0 >.profile ${ABSHELL} <<< """ HOME=$PWD \ PATH=$PATH \ SHELL=$ABSSHELL \ $( v=$(getconf LIBPATH) for v in ${v//,/ } do v=${v#*:} v=${v%%:*} eval [[ \$$v ]] && eval print -n \" \"\$v=\"\$$v\" done ) \ exec -c -a -ksh ${ABSHELL} -c "exit 1" 1>/dev/null 2>&1 """ setvar status = $(echo $?) if [[ -o noprivileged && $status != 0 ]] { err_exit 'exit in .profile is ignored' } elif [[ -o privileged && $status == 0 ]] { err_exit 'privileged .profile not ignored' } if [[ $(trap 'code=$?; echo $code; trap 0; exit $code' 0; exit 123) != 123 ]] { err_exit 'exit not setting $?' } cat > run.sh <<< ''' trap 'code=$?; echo $code; trap 0; exit $code' 0 ( trap 0; exit 123 ) ''' if [[ $($SHELL ./run.sh) != 123 ]] { err_exit 'subshell trap on exit overwrites parent trap' } cd ~- || err_exit "cd back failed" $SHELL -c 'builtin -f cmd getconf; getconf --"?-version"; exit 0' >/dev/null 2>&1 || err_exit 'ksh plugin exit failed -- was ksh built with CCFLAGS+=$(CC.EXPORT.DYNAMIC)?' exit $((Errors))