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