pkgsrc/sysutils/adjustkernel/files/adjustkernel

135 lines
2.8 KiB
Perl

#!/usr/pkg/bin/perl
#--------------------------------------------------------------------------
# %Id: adjustkernel,v 1.1 1999/10/15 01:21:30 feyrer Exp feyrer %
# $Emsi: adjustkernel,v 1.4 2001/10/04 22:26:26 mjl Exp $
#
# Usage: adjustkernel -f GENERIC [-o outfile] [-d]
#
# commends out any lines that aren't found in the current kernel (dmesg)
#
#--------------------------------------------------------------------------
use strict;
use Getopt::Long;
#--------------------------------------------------------------------------
sub findInDmesg($$);
#--------------------------------------------------------------------------
my $kernel;
my $outname;
my $debug = 0;
my $remove = 0;
my $mesg;
die "Invalid command line" unless GetOptions(
'debug+' => \$debug,
'file=s' => \$kernel,
'outfile=s' => \$outname,
'remove+' => \$remove,
'mesg=s' => \$mesg
);
###########################################################################
die "Usage: $0 [-d] [-o outfile] -f kernel-config\n" unless $kernel;
$| = 1 if $debug;
if($outname)
{
close STDOUT;
open STDOUT, "> $outname" or die "Cannot write $outname: $!";
}
my @dmesg;
if($mesg)
{
open DMESG, "< $mesg" or die "Cannot read $mesg: $!";
@dmesg = <DMESG>;
close DMESG;
}
else
{
@dmesg = `dmesg`;
}
@dmesg = grep /^\s*\w+\s+at\s+\w+/, @dmesg;
#--------------------------------------------------------------------------
open(K,"$kernel") or die "Cannot read $kernel: $!";
while (<K>)
{
chomp;
if (/^\s*#/)
{ # Already commented out
# Nothing
}
elsif (/(\S*)\s+at\s+(\S*)(\s*.*)$/)
{
my ( $dev, $where, $comment ) = ( $1, $2, $3 );
print STDERR "#>> Have? <$dev> at <$where><$comment>\n" if $debug;
# Deal with inconsistencies
$where = '\w+\d' if $where =~ /^mii/o;
# Expand wildcards
my $gdev=$dev;
if ($dev =~ /[?*]$/o)
{
$gdev="$`\\d";
}
my $gwhere = $where;
if ($where =~ /[?*]$/o)
{
$gwhere="$`\\d";
}
my $spat = "^${gdev}\\s+at\\s+${gwhere}";
print STDERR "#>> ? $spat\n" if $debug;
my $l = findInDmesg(\@dmesg, "^${gdev}\\s+at\\s+${gwhere}");
if (! $l)
{
if ($dev !~ /mainbus/)
{ # inconsistent in dmesg, never comment out mainbus at something
next if $remove;
print "#(# ";
}
}
}
print "$_\n";
}
close(K);
# Mention what we didn't find.
foreach (@dmesg)
{
print "# NOTE: NoMatch: $_";
}
exit 0;
#--------------------------------------------------------------------------
sub findInDmesg($$)
{
my ( $dref, $pattern ) = @_;
my @r = grep /$pattern/, @$dref;
# We matched it once, so remove it from dmesg.
# Ie. we match tr0 at isa once, but not tr* at isa later on
@$dref = grep !/$pattern/, @$dref;
print STDERR "#>> Have! @r" if @r && $debug;
return scalar(@r) ? $r[0] : undef;
}
#--------------------------------------------------------------------------