#!/bin/sh
#
# Ensure that strace can detach from stopped processes.
#
# Copyright (c) 2013-2015 Dmitry V. Levin <ldv@altlinux.org>
# 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

rm -f "$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
}

rm -f "$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 '^State:.*T (stopped)' < /proc/$tracee_pid/status > /dev/null || {
		grep '^State:' < /proc/$tracee_pid/status
		cleanup
		dump_log_and_fail_with 'tracee is not group-stopped after detach'
	}
fi

cleanup
exit 0
