blob: 85e7ff77176d5826b7a79c6fe91b587812761e0a [file] [log] [blame]
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +00001#!/usr/bin/perl -w
2# -----------------------------------------------------------------------------
Alexandre Julliardc7c217b1998-04-13 12:21:30 +00003#
4# Relay-checker.
5#
6# This program will inspect a log file with relay information and tell you
7# whether calls and returns match. If not, this suggests that the parameter
8# list might be incorrect. (It could be something else also.)
9#
10# Copyright 1997-1998 Morten Welinder (terra@diku.dk)
11#
12# -----------------------------------------------------------------------------
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000013
14my $srcfile = $ARGV[0];
15my @callstack = ();
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000016my $newlineerror = 0;
17my $indentp = 1;
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000018
19open (IN, "<$srcfile") || die "Cannot open $srcfile for reading: $!\n";
20LINE:
21while (<IN>) {
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000022 if (/^Call ([A-Za-z0-9]+\.\d+): .*\)/) {
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000023 my $func = $1;
24 if (/ ret=(........)$/ ||
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000025 / ret=(....:....) (ds=....)$/ ||
26 / ret=(........) (fs=....)$/) {
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000027 my $retaddr = $1;
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000028 my $segreg = $2;
29
30 $segreg = "none" unless defined $segreg;
31 push @callstack, [$func,$retaddr, $segreg];
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000032 next;
33 } else {
34 # Assume a line got cut by a line feed in a string.
35 $_ .= scalar (<IN>);
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000036 if (!$newlineerror) {
37 print "Error: string probably cut by newline.\n";
38 $newlineerror = 1;
39 }
40 # print "[$_]";
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000041 redo;
42 }
43 }
44
45
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000046 if (/^Ret ([A-Za-z0-9]+\.\d+): .* ret=(........)$/ ||
47 /^Ret ([A-Za-z0-9]+\.\d+): .* ret=(....:....) (ds=....)$/ ||
48 /^Ret ([A-Za-z0-9]+\.\d+): .* ret=(........) (fs=....)$/) {
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000049 my $func = $1;
50 my $retaddr = $2;
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000051 my $segreg = $3;
52 my ($topfunc,$topaddr,$topseg);
53
54 $segreg = "none" unless defined $segreg;
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000055
56 POP:
57 while (1) {
58 if ($#callstack == -1) {
59 print "Error: Return from $func to $retaddr with empty stack.\n";
60 next LINE;
61 }
62
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000063 ($topfunc,$topaddr,$topseg) = @{pop @callstack};
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000064
65 if ($topfunc ne $func) {
66 print "Error: Return from $topfunc, but call from $func.\n";
67 next POP
68 }
69 last POP;
70 }
71
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000072 my $addrok = ($topaddr eq $retaddr);
73 my $segok = ($topseg eq $segreg);
74 if ($addrok && $segok) {
75 print "OK: ", ($indentp ? (' ' x (1 + $#callstack)) : '');
76 print "$func from $retaddr with $segreg.\n";
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000077 } else {
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000078 print "Error: Return from $func is to $retaddr, not $topaddr.\n"
79 if !$addrok;
80 print "Error: Return from $func with segreg $segreg, not $topseg.\n"
81 if !$segok;
Alexandre Julliarda0b2b1d1997-11-16 17:38:29 +000082 }
83 }
84}
85
86while ($#callstack != -1) {
87 my ($topfunc,$topaddr) = @{pop @callstack};
88 print "Error: leftover call to $topfunc from $topaddr.\n";
89}
90
91close (IN);