15dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#!/bin/sh
25dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
35dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes# Ensure that strace can detach from stopped processes.
45dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
55dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes. "${srcdir=.}/init.sh"
65dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
75dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughescheck_prog sleep
85dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughescheck_prog grep
95dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
105dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesset -e
115dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
125dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesrm -f $LOG
135dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes./set_ptracer_any sleep $((2*$TIMEOUT_DURATION)) > $LOG &
145dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
155dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheswhile ! [ -s $LOG ]; do
165dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	kill -0 $! 2> /dev/null ||
175dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes		fail_ 'set_ptracer_any sleep failed'
185dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	$SLEEP_A_BIT
195dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesdone
205dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
215dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughestracee_pid=$!
225dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheskill -STOP $tracee_pid
235dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
245dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughescleanup()
255dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes{
265dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	set +e
275dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	kill $tracee_pid
285dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	kill -CONT $tracee_pid
295dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	wait $tracee_pid 2> /dev/null
305dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes}
315dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
325dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesrm -f $LOG
335dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes$STRACE -p $tracee_pid 2> $LOG &
345dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
355dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheswhile ! grep -F "Process $tracee_pid attached" $LOG > /dev/null; do
365dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	kill -0 $! 2> /dev/null ||
375dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes		{ cat $LOG; cleanup; fail_ 'strace -p does not work'; }
385dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	$SLEEP_A_BIT
395dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesdone
405dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
415dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheswhile ! grep -F -e '--- stopped by ' $LOG > /dev/null; do
425dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	kill -0 $! 2> /dev/null ||
435dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes		{ cat $LOG; cleanup; fail_ 'strace -p does not work'; }
445dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	$SLEEP_A_BIT
455dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesdone
465dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
475dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheskill -INT $!
485dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hugheswait $!
495dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
505dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesgrep -F "Process $tracee_pid detached" $LOG > /dev/null ||
515dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	{ cat $LOG; cleanup; fail_ 'strace -p failed to detach'; }
525dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
535dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesif [ -f /proc/self/status ]; then
545dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	$SLEEP_A_BIT
555dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	test -d /proc/$tracee_pid ||
565dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes		{ cat $LOG; cleanup; fail_ 'tracee died after detach'; }
575dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	grep '^State:.*T (stopped)' < /proc/$tracee_pid/status > /dev/null || {
585dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes		cat $LOG
595dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes		grep '^State:' < /proc/$tracee_pid/status
605dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes		cleanup
615dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes		fail_ 'tracee is not group-stopped after detach'
625dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes	}
635dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesfi
645dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes
655dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughescleanup
665dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesexit 0
67