7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin########################################################################
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# This software is part of the ast package #
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and is licensed under the #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# A copy of the License is available at #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# http://www.opensource.org/licenses/cpl1.0.txt #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Information and Software Systems Research #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# AT&T Research #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Florham Park NJ #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# David Korn <dgk@research.att.com> #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin########################################################################
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction err_exit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -n "\t"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -r ${Command}[$1]: "${@:2}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( Errors++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinalias err_exit='err_exit $LINENO'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinCommand=${0##*/}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger Errors=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap "cd /; rm -rf $tmp" EXIT
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcd $tmp || err_exit "cd $tmp failed"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz set --pipefail
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz $SHELL 2> out2 <<- \EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz g=false
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz trap 'print -u2 PIPED; $g && exit 0;g=true' PIPE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz while :
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz do print hello
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } | head > /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (( $? == 0)) || err_exit "SIGPIPE with wrong error code $?"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $(<out2) == $'PIPED\nPIPED' ]] || err_exit 'SIGPIPE output on standard error is not correct'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz) &
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcop=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{ sleep 4; kill $cop; } 2>/dev/null &
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzspy=$!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif wait $cop 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzthen kill $spy 2>/dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzelse err_exit "pipe with --pipefail PIPE trap hangs"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzwait
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzrm -f out2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ $( trap 'print -n got_child' SIGCHLD
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sleep 2 &
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for ((i=0; i < 4; i++))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz do sleep .75
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -n $i
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done) == 01got_child23 ]] || err_exit 'SIGCHLD not working'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# begin standalone SIGINT test generation
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincat > tst <<'!'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# shell trap tests
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# tst control script that calls tst-1, must be run by ksh
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# tst-1 calls tst-2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# tst-2 calls tst-3
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# tst-3 defaults or handles and discards/propagates SIGINT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# initial -v option lists script entry and SIGINT delivery
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# three test options
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# d call next script directly, otherwise via $SHELL -c
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# t trap, echo, and kill self on SIGINT, otherwise x or SIGINT default if no x
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# x trap, echo on SIGINT, and tst-3 exit 0, tst-2 exit, otherwise SIGINT default
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# z trap, echo on SIGINT, and tst-3 exit 0, tst-2 exit 0, otherwise SIGINT default
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Usage: tst [-v] [-options] shell-to-test ...
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "trap + sig" is an unadvertized extension for this test
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# if run from nmake SIGINT is set to SIG_IGN
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# this call sets it back to SIG_DFL
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# semantics w.r.t. function scope must be worked out before
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# making it public
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintrap + INT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset -o monitor
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction gen
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset o t x d
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for x in - x z
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do case $x in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [$1]) for t in - t
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do case $t in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [$1]) for d in - d
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do case $d in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [$1]) o="$o $x$t$d"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin echo '' $o
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin-v) v=v; shift ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin-*v*) v=v ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*) v= ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*' '*) o=$1; shift ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin-*) o=$(gen $1); shift ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*) o=$(gen -txd) ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $# in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin0) set ksh bash ksh88 pdksh ash zsh ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfor f in $o
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindo case $# in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 1) ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *) echo ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for sh
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do if $sh -c 'exit 0' > /dev/null 2>&1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin then case $# in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 1) printf '%3s ' "$f" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *) printf '%16s %3s ' "$sh" "$f" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin $sh tst-1 $v$f $sh > tst.out &
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin wait
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin echo $(cat tst.out)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $# in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin1) ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*) echo ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin!
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincat > tst-1 <<'!'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexec 2>/dev/null
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*v*) echo 1-main ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sleep 2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *v*) echo "SIGINT" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin kill -s INT 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin} &
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*t*) trap '
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin echo 1-intr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin trap - INT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # omitting the self kill exposes shells that deliver
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # the SIGINT trap but exit 0 for -xt
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # kill -s INT $$
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ' INT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*d*) tst-2 $1 $2; status=$? ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*) $2 -c "tst-2 $1 $2"; status=$? ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprintf '1-%04d\n' $status
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinsleep 2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin!
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincat > tst-2 <<'!'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz*z*) trap '
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz echo 2-intr
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz exit 0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ' INT
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*x*) trap '
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin echo 2-intr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin exit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ' INT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*t*) trap '
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin echo 2-intr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin trap - INT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin kill -s INT $$
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ' INT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*v*) echo 2-main ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*d*) tst-3 $1 $2; status=$? ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*) $2 -c "tst-3 $1 $2"; status=$? ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprintf '2-%04d\n' $status
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin!
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincat > tst-3 <<'!'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz*[xz]*) trap '
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sleep 2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin echo 3-intr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin exit 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ' INT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*) trap '
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sleep 2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin echo 3-intr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin trap - INT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin kill -s INT $$
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ' INT
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase $1 in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin*v*) echo 3-main ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinsleep 5
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprintf '3-%04d\n' $?
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin!
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinchmod +x tst tst-?
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# end standalone test generation
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexport PATH=$PATH:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -A expected
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexpected[---]="3-intr"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexpected[--d]="3-intr"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexpected[-t-]="3-intr 2-intr 1-intr 1-0258"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexpected[-td]="3-intr 2-intr 1-intr 1-0258"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected[x--]="3-intr 2-intr"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected[x-d]="3-intr 2-intr"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected[xt-]="3-intr 2-intr 1-intr 1-0258"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected[xtd]="3-intr 2-intr 1-intr 1-0258"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected[z--]="3-intr 2-intr 1-0000"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected[z-d]="3-intr 2-intr 1-0000"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected[zt-]="3-intr 2-intr 1-intr 1-0000"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexpected[ztd]="3-intr 2-intr 1-intr 1-0000"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintst $SHELL > tst.got
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile read ops out
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindo [[ $out == ${expected[$ops]} ]] || err_exit "interrupt $ops test failed -- expected '${expected[$ops]}', got '$out'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone < tst.got
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfloat s=$SECONDS
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $($SHELL -c 'trap "print SIGUSR1 ; exit 0" USR1; (trap "" USR1 ; exec kill -USR1 $$ & sleep 5); print done') == SIGUSR1 ]] || err_exit 'subshell ignoring signal does not send signal to parent'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin(( (SECONDS-s) < 4 )) && err_exit 'parent does not wait for child to complete before handling signal'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin((s = SECONDS))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $($SHELL -c 'trap "print SIGUSR1 ; exit 0" USR1; (trap "exit" USR1 ; exec kill -USR1 $$ & sleep 5); print done') == SIGUSR1 ]] || err_exit 'subshell catching signal does not send signal to parent'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin(( SECONDS-s < 4 )) && err_exit 'parent completes early'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzunset n s t
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfor s in $(kill -l)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo if ! n=$(kill -l $s 2>/dev/null)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then err_exit "'kill -l $s' failed"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ! t=$(kill -l $n 2>/dev/null)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then err_exit "'kill -l $n' failed"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if [[ $s == ?(SIG)$t ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then continue
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if ! m=$(kill -l $t 2>/dev/null)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then err_exit "'kill -l $t' failed"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if [[ $m == $n ]]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz then continue
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz fi
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz err_exit "'kill -l $s' => $n, 'kill -l $n' => $t, kill -l $t => $m -- expected $n"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzyes=$(whence -p yes)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $yes ]] && for exp in TERM VTALRM PIPE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdo { $SHELL <<- EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz foo() { return 0; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz trap foo EXIT
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz { sleep 2; kill -$exp \$\$; sleep 3; kill -0 \$\$ && kill -KILL \$\$; } &
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz $yes | while read yes; do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz (/bin/date; sleep .1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz done > /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz EOF
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz } 2>> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz got=$(kill -l $?)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz [[ $exp == $got ]] || err_exit "kill -$exp \$\$ failed, required termination by signal '$got'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzdone
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzSECONDS=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL 2> /dev/null -c 'sleep 2 && kill $$ & trap "print done;exit 3" EXIT; (sleep 5);print finished' > $tmp/sig
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( $?==3)) || err_exit "wrong exit status expecting 3 got $?"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzx=$(<$tmp/sig)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $x == done ]] || err_exit "wrong result - execting done got $x"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( SECONDS > 3.5 )) && err_exit "took $SECONDS seconds, expecting around 2"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzSECONDS=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{ $SHELL 2> /dev/null -c 'sleep 2 && kill $$ & trap "print done;exit" EXIT; (sleep 5);print finished' > $tmp/sig ;} 2> /dev/null
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $(kill -l $?) == TERM ]] || err_exit "wrong exit status expecting TERM got $(kill -l $?)"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzx=$(<$tmp/sig)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $x == done ]] || err_exit "wrong result - execting done got $x"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( SECONDS > 3.5 )) && err_exit "took $SECONDS seconds, expecting around 2"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzSECONDS=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzx=$($SHELL 2> /dev/null -c 'sleep 2 && kill $$ & trap "print done;exit 3" EXIT; (sleep 5);print finished')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( $?==3)) || err_exit "wrong exit status expecting 3 got $?"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $x == done ]] || err_exit "wrong result - execting done got $x"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( SECONDS < 4 )) && err_exit "took $SECONDS seconds, expecting around 5"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap '' SIGBUS
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ $($SHELL -c 'trap date SIGBUS;trap -p SIGBUS') ]] && err_exit 'SIGBUS should not have a trap'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainztrap -- - SIGBUS
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexit $((Errors))