#!/bin/awk -f
#
# Copyright (C) 2003  Dmitry V. Levin <ldv@altlinux.org>
# Copyright (C) 2007  Alexey Tourbin <at@altlinux.org>
#
# The strace post processor.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#

function canonicalize(path)
{
	gsub(/\/\/+/, "/", path)
	gsub(/(\/\.)+(\/|$)/, "/", path)
	while (sub(/\/[^\/]+\/\.\.(\/|$)/, "/", path)) ;
	sub(/^\/\.\.(\/|$)/, "/", path)
	sub(/\/$/, "", path)
	return path ? path : "/"
}

BEGIN {
	SUBSEP = "\t"
	delete OUTPUT

	delete TRACE_FILES
	filelist = ENVIRON["TRACE_FILELIST"]
	if (filelist)
		while ((getline <filelist) > 0)
			TRACE_FILES[$1] = 1
}

function output(syscall, filename)
{
	if (!((syscall, filename) in OUTPUT)) {
		filename = canonicalize(filename)
		OUTPUT[syscall, filename] = 1
	}
	if (filename in TRACE_FILES)
		printf "\n\t*** spp: %s %s\n", syscall, filename >"/dev/stderr"
}

END {
	for (line in OUTPUT)
		print line
}

match($0, /^[1-9][0-9]*[[:space:]]+([[:alnum:]_]+at)\([^",]+, "(\/[^"]*)", .*\) += [[:alnum:]]+$/, ary) {
	output(ary[1], ary[2]);
	next;
}

match($0, /^[1-9][0-9]*[[:space:]]+([[:alnum:]_]+)\("(\/[^"]*)", .*\) += [[:alnum:]]+$/, ary) {
	output(ary[1], ary[2]);
	next;
}
