#!/bin/sh
#
# Ensure that strace can detach from stopped processes.
#
# Copyright (c) 2013-2015 Dmitry V. Levin <ldv@altlinux.org>
# Copyright (c) 2014-2017 The strace developers.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
#    derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

. "${srcdir=.}/init.sh"

run_prog_skip_if_failed \
	kill -0 $$

check_prog sleep

$STRACE -d -enone / > /dev/null 2> "$LOG"
if grep -x "[^:]*strace: PTRACE_SEIZE doesn't work" "$LOG" > /dev/null; then
	skip_ "PTRACE_SEIZE doesn't work"
fi

set -e

> "$LOG"
../set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > "$LOG" &

while ! [ -s "$LOG" ]; do
	kill -0 $! 2> /dev/null ||
		fail_ 'set_ptracer_any sleep failed'
	$SLEEP_A_BIT
done

tracee_pid=$!
kill -STOP $tracee_pid

cleanup()
{
	set +e
	kill $tracee_pid
	kill -CONT $tracee_pid
	wait $tracee_pid 2> /dev/null
	return 0
}

> "$LOG"
$STRACE -p $tracee_pid 2> "$LOG" &

while ! grep -F "Process $tracee_pid attached" "$LOG" > /dev/null; do
	kill -0 $! 2> /dev/null || {
		cleanup
		dump_log_and_fail_with "$STRACE -p failed to attach"
	}
	$SLEEP_A_BIT
done

while ! grep -F -e '--- stopped by ' "$LOG" > /dev/null; do
	kill -0 $! 2> /dev/null || {
		cleanup
		dump_log_and_fail_with "$STRACE -p missed stop notifications"
	}
	$SLEEP_A_BIT
done

kill -INT $!
wait $!

grep -F "Process $tracee_pid detached" "$LOG" > /dev/null || {
	cleanup
	dump_log_and_fail_with "$STRACE -p failed to detach"
}

if [ -f /proc/self/status ]; then
	$SLEEP_A_BIT
	test -d /proc/$tracee_pid || {
		cleanup
		dump_log_and_fail_with 'tracee died after detach'
	}
	grep_pid_status "$tracee_pid" '^State:.*T (stopped)' > /dev/null || {
		grep_pid_status "$tracee_pid" '^State:'
		cleanup
		dump_log_and_fail_with 'tracee is not group-stopped after detach'
	}
fi

cleanup
exit 0
