#!/bin/sh
#
# Ensure that strace -k works.
#
# Copyright (c) 2014 Masatake YAMATO <yamato@redhat.com>
# Copyright (c) 2014-2016 Dmitry V. Levin <ldv@altlinux.org>
# Copyright (c) 2014-2018 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"

# strace -k is implemented using /proc/$pid/maps
[ -f /proc/self/maps ] ||
	framework_skip_ '/proc/self/maps is not available'

check_prog grep
check_prog sed
check_prog tr

run_prog "${test_prog=../stack-fcall}"
run_strace -e getpid -k $args

expected="$srcdir/$NAME.expected"
awk '
/^[^ ]/ {
	if (out != "")
		print out

	syscall = gensub(/^([[:alnum:]_]+)\(.*/, "\\1", 1)
	signal = gensub(/^--- ([A-Z]+) .*/, "\\1", 1)

	if (syscall != $0) {
		out = syscall
		stop = 0
	} else if (signal != $0) {
		out = signal
		stop = 0
	} else {
		out = ""
	}
}

/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) / && !stop {
	sym = gensub(/^ >[^(]+\(([^+]+)\+0x[a-f0-9]+\) .*$/, "\\1", 1)
	out = out " " sym
	if (sym == "main")
		stop = 1
}' "$LOG" > "$OUT"

LC_ALL=C grep -E -x -f "$expected" < "$OUT" > /dev/null || {
	cat >&2 <<__EOF__
Failed pattern of expected output:
$(cat "$expected")
Actual output:
$(cat "$OUT")
__EOF__

	pattern=
	case "$STRACE_ARCH" in
		aarch64|i386|ppc*|s390*|sparc*|x32|x86*)
			# These architectures are supported by elfutils libdw,
			# see grep '\<HOOK\>.*\<abi_cfi\>' elfutils/backends
			;;
		arm) pattern='No DWARF information found'
			# This is also supported by elfutils libdw
			# but the latter needs debuginfo for unwinding.
			;;
		*) pattern='Unwinding not supported for this architecture'
			;;
	esac
	if [ -n "$pattern" ] &&
	   LC_ALL=C grep -x " > $pattern" < "$LOG" > /dev/null; then
		cat < "$LOG" >&2
		skip_ "stack tracing is not fully supported on $STRACE_ARCH yet"
	fi

	dump_log_and_fail_with "$STRACE $args output mismatch"
}
