#!/usr/bin/env perl
#
# This parses kdump output and decodes writes to file descriptors 
# into writes to filenames.
# 
use strict;
use warnings;
my %fds;
my $prevname;
my $curdir = shift;
if (!$curdir)
{
	$curdir = `pwd`;
}

while (<>)
{
	if (/NAMI\s*"(.*)"$/)
	{
		$prevname = $1;
	}
	if (/RET\s*open\s*(\d*)$/)
	{
		my $fd = $1;
		$fds{$fd} = $prevname;
	}
	if (/CALL\s*write\((\d*),(.*)\)/)
	{
		my $fd = $1;
		my $args = $2;
		if (exists $fds{$fd})
		{
			my $file = $fds{$fd};
			if (! ($file =~ m,^/,))
			{
				$file = $curdir . "/" . $file;
			}
			print "CALL write(\"$file\",$args) (line $.)\n";
		}
		else
		{
			print "CALL write($fd,$args) (line $.)\n";
		}
	}
	if (/CALL\s*close\((\d*)\)/)
	{
		my $fd = $1;
		delete $fds{$fd};
	}
	if (/RET\s*chdir\s*0$/)
	{
		if ($prevname =~ m,^/,)
		{
			$curdir = $prevname;
		}
		else
		{
			$curdir .= "/" . $prevname;
		}
	}
}
