diff --git a/adapter-tests/v1/runner.sh b/adapter-tests/v1/runner.sh index 0ffe8d7..c3f61f8 100755 --- a/adapter-tests/v1/runner.sh +++ b/adapter-tests/v1/runner.sh @@ -29,16 +29,22 @@ fixture_root=$(CDPATH='' cd -P -- "$fixture_root" && pwd -P) || runner_error E_F [ -d "$fixture_root/scratch" ] && [ -d "$fixture_root/target/.git" ] || runner_error E_FIXTURE run_tmp=$(/usr/bin/mktemp -d "$fixture_root/scratch/run.XXXXXX") || runner_error -cleanup() { /bin/rm -rf -- "$run_tmp"; } +cleanup() { + if [ -n "${run_tmp:-}" ]; then + /bin/rm -rf -- "$run_tmp" + fi +} ACTIVE_CHILD_GROUP='' ACTIVE_CHILD_PID='' +SIGNAL_DEFER=0 +SIGNAL_EXITING=0 PENDING_SIGNAL_STATUS=0 group_alive() { [[ "${1:-}" =~ ^[1-9][0-9]*$ ]] && kill -0 -- "-$1" 2>/dev/null } terminate_active_group() { - local group=$ACTIVE_CHILD_GROUP - local leader=$ACTIVE_CHILD_PID + local group=${ACTIVE_CHILD_GROUP:-} + local leader=${ACTIVE_CHILD_PID:-} local tick if [[ "$group" =~ ^[1-9][0-9]*$ ]]; then kill -TERM -- "-$group" 2>/dev/null || : @@ -57,7 +63,7 @@ terminate_active_group() { ACTIVE_CHILD_PID='' } signal_exit() { - local status=$1 + local status=${1:-1} trap '' HUP INT TERM trap - EXIT exec >/dev/null 2>&1 @@ -65,14 +71,18 @@ signal_exit() { cleanup exit "$status" } -record_pending_signal() { PENDING_SIGNAL_STATUS=$1; } -install_normal_signal_handlers() { - trap 'signal_exit 129' HUP - trap 'signal_exit 130' INT - trap 'signal_exit 143' TERM +handle_signal() { + [ "${SIGNAL_EXITING:-0}" -eq 0 ] || return 0 + local status=${1:-1} + PENDING_SIGNAL_STATUS=$status + [ "${SIGNAL_DEFER:-0}" -eq 0 ] || return 0 + SIGNAL_EXITING=1 + signal_exit "$status" } trap cleanup EXIT -install_normal_signal_handlers +trap 'handle_signal 129' HUP +trap 'handle_signal 130' INT +trap 'handle_signal 143' TERM /bin/mkdir -m 700 "$run_tmp/home" sha_file() { /usr/bin/shasum -a 256 "$1" | /usr/bin/awk '{print $1}'; } @@ -346,14 +356,12 @@ run_child() { CHILD_STATUS=0 CHILD_ERROR='' /bin/mkdir -m 700 "$child_home" - if [ -n "$ACTIVE_CHILD_GROUP" ] || [ -n "$ACTIVE_CHILD_PID" ]; then + if [ -n "${ACTIVE_CHILD_GROUP:-}" ] || [ -n "${ACTIVE_CHILD_PID:-}" ]; then CHILD_ERROR=E_RUNTIME return 1 fi PENDING_SIGNAL_STATUS=0 - trap 'record_pending_signal 129' HUP - trap 'record_pending_signal 130' INT - trap 'record_pending_signal 143' TERM + SIGNAL_DEFER=1 set -m ( ulimit -t 2 -f 2048 -n 64 @@ -372,10 +380,11 @@ run_child() { ACTIVE_CHILD_GROUP=$pid ACTIVE_CHILD_PID=$pid set +m - install_normal_signal_handlers - pending_status=$PENDING_SIGNAL_STATUS + SIGNAL_DEFER=0 + pending_status=${PENDING_SIGNAL_STATUS:-0} PENDING_SIGNAL_STATUS=0 if [ "$pending_status" -ne 0 ]; then + SIGNAL_EXITING=1 signal_exit "$pending_status" fi while kill -0 "$pid" 2>/dev/null; do @@ -388,7 +397,7 @@ run_child() { /bin/sleep 0.05 done wait "$pid" || CHILD_STATUS=$? - if group_alive "$ACTIVE_CHILD_GROUP"; then + if group_alive "${ACTIVE_CHILD_GROUP:-}"; then terminate_active_group CHILD_ERROR=E_DESCENDANT return 1