1*4887Schin######################################################################## 2*4887Schin# # 3*4887Schin# This software is part of the ast package # 4*4887Schin# Copyright (c) 1982-2007 AT&T Knowledge Ventures # 5*4887Schin# and is licensed under the # 6*4887Schin# Common Public License, Version 1.0 # 7*4887Schin# by AT&T Knowledge Ventures # 8*4887Schin# # 9*4887Schin# A copy of the License is available at # 10*4887Schin# http://www.opensource.org/licenses/cpl1.0.txt # 11*4887Schin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 12*4887Schin# # 13*4887Schin# Information and Software Systems Research # 14*4887Schin# AT&T Research # 15*4887Schin# Florham Park NJ # 16*4887Schin# # 17*4887Schin# David Korn <dgk@research.att.com> # 18*4887Schin# # 19*4887Schin######################################################################## 20*4887Schinfunction err_exit 21*4887Schin{ 22*4887Schin print -u2 -n "\t" 23*4887Schin print -u2 -r ${Command}[$1]: "${@:2}" 24*4887Schin let Errors+=1 25*4887Schin} 26*4887Schinalias err_exit='err_exit $LINENO' 27*4887Schin 28*4887Schinfunction abspath 29*4887Schin{ 30*4887Schin base=$(basename $SHELL) 31*4887Schin cd ${SHELL%/$base} 32*4887Schin newdir=$(pwd) 33*4887Schin cd ~- 34*4887Schin print $newdir/$base 35*4887Schin} 36*4887Schin#test for proper exit of shell 37*4887SchinCommand=${0##*/} 38*4887Schininteger Errors=0 39*4887Schinbuiltin getconf 40*4887SchinABSHELL=$(abspath) 41*4887Schinmkdir /tmp/ksh$$ || err_exit "mkdir /tmp/ksh$$ failed" 42*4887Schincd /tmp/ksh$$ || err_exit "cd /tmp/ksh$$ failed" 43*4887Schinprint exit 0 >.profile 44*4887Schin${ABSHELL} <<! 45*4887SchinHOME=$PWD \ 46*4887SchinPATH=$PATH \ 47*4887SchinSHELL=$ABSSHELL \ 48*4887Schin$( 49*4887Schin set --noglob 50*4887Schin ifs=$IFS 51*4887Schin IFS=, 52*4887Schin set -- $(getconf LIBPATH) 53*4887Schin IFS=$ifs 54*4887Schin for v 55*4887Schin do IFS=: 56*4887Schin set -- $v 57*4887Schin IFS=$ifs 58*4887Schin eval [[ \$$2 ]] && eval print -n \" \"\$2=\"\$$2\" 59*4887Schin done 60*4887Schin) \ 61*4887Schinexec -c -a -ksh ${ABSHELL} -c "exit 1" 1>/dev/null 2>&1 62*4887Schin! 63*4887Schinstatus=$(echo $?) 64*4887Schinif [[ -o noprivileged && $status != 0 ]] 65*4887Schinthen err_exit 'exit in .profile is ignored' 66*4887Schinelif [[ -o privileged && $status == 0 ]] 67*4887Schinthen err_exit 'privileged .profile not ignored' 68*4887Schinfi 69*4887Schinif [[ $(trap 'code=$?; echo $code; trap 0; exit $code' 0; exit 123) != 123 ]] 70*4887Schinthen err_exit 'exit not setting $?' 71*4887Schinfi 72*4887Schincat > run.sh <<- "EOF" 73*4887Schin trap 'code=$?; echo $code; trap 0; exit $code' 0 74*4887Schin ( trap 0; exit 123 ) 75*4887SchinEOF 76*4887Schinif [[ $($SHELL ./run.sh) != 123 ]] 77*4887Schinthen err_exit 'subshell trap on exit overwrites parent trap' 78*4887Schinfi 79*4887Schincd ~- || err_exit "cd back failed" 80*4887Schinrm -r /tmp/ksh$$ || err_exit "rm -r /tmp/ksh$$ failed" 81*4887Schinexit $((Errors)) 82