6
if (!defined($ARGV[0])) {
7
print "usage: requires .class dump as parameter!\n";
13
untie %bcheckdb if(defined(%bcheckdb));
16
flock MYLOCK, LOCK_UN;
26
my ($dbkey, $dbchunk) = @_;
28
if (defined($ENV{"BCHECK_UPDATE"})) {
29
$bcheckdb{$dbkey} = $dbchunk;
33
&bailout("BC problem detected") if (! -t STDIN);
35
print "(I)gnore / (Q)uit / (U)pdate: ";
38
while(defined(read STDIN, $key, 1)) {
41
print "got: >$key<\n";
43
return if ($key eq 'i');
45
&bailout("BC problem. aborted") if ($key eq 'q');
48
$bcheckdb{$dbkey} = $dbchunk;
51
print "\n(I)gnore / (Q)uit / (U)pdate: ";
57
my ($oldl, $newl) = @_;
58
my @old = split /^/m, $oldl;
59
my @new = split /^/m, $newl;
61
my $max = $#old > $#new ? $#old : $#new;
63
die "whoops. key different" if ($old[0] ne $new[0]);
66
warn ("Structural difference.\n");
68
print "-----------------------------------------------\n";
76
my ($class) = ($old[0] =~ /^(?:Class |Vtable for )(\S+)/);
80
my ($o, $n) = ($old[$c], $new[$c]);
86
if(defined($class) and $n =~ /^(\d+\s+)\w+(::\S+\s*.*)$/) {
87
next if ($n eq "$1$class$2");
98
local $dblock = $ENV{"HOME"} . "/bcheck.lock";
99
my $dbfile = $ENV{"HOME"} . "/bcheck.db";
100
my $cdump = $ARGV[0];
102
die "file $cdump is not readable: $!" if (! -f $cdump);
104
# make sure the advisory lock exists
105
open(MYLOCK, ">$dblock");
108
flock MYLOCK, LOCK_EX;
110
tie %bcheckdb, 'DB_File', $dbfile;
114
open (IN, "<$cdump") or die "cannot open $cdump: $!";
119
s/0x[0-9a-fA-F]+/0x......../g;
120
s/base size=/size=/g;
121
s/base align=/align=/g;
126
my @lines = split /^/m, $chunk;
130
if($key !~ /<anonymous struct>/ &&
131
$key !~ /<anonymous union>/) {
132
if(defined($bcheckdb{$key})) {
133
my $dbversion = $bcheckdb{$key};
135
if($dbversion ne $chunk) {
136
&ask_user($key, $chunk) if(&diff_chunk($dbversion, $chunk));
140
$bcheckdb{$key} = $chunk;
153
flock MYLOCK, LOCK_UN;