diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-06-08 15:07:18 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-06-08 15:07:18 -0300 |
commit | 6b9db488d186cc23b3ab9a64fc2ad687c07407bf (patch) | |
tree | 1e6945c234507f460949bc619e116a0c4bbbf46b /v4l/scripts/rmmod.pl | |
parent | ea9723bc221278765e75d0362ce36881285ee241 (diff) | |
download | mediapointer-dvb-s2-6b9db488d186cc23b3ab9a64fc2ad687c07407bf.tar.gz mediapointer-dvb-s2-6b9db488d186cc23b3ab9a64fc2ad687c07407bf.tar.bz2 |
insmod.sh were replaced by a perl script (rmmod.pl)
From: Mauro Carvalho Chehab <mchehab@infradead.org>
insmod.sh were a hack, were somebody should check all dependencies
for each module. Several dependencies were mising, and, to keep it
updated for 178 modules is really hard.
rmmod.pl is a "smart" script: it does:
1) Check, for each found module on v4l, the correct order for each
module;
2) Check any dependencies for out-of-tree modules;
3) rmmod/insmod at the correct order;
4) It have a table with the suggested debug parameter for each module.
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'v4l/scripts/rmmod.pl')
-rw-r--r-- | v4l/scripts/rmmod.pl | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/v4l/scripts/rmmod.pl b/v4l/scripts/rmmod.pl new file mode 100644 index 000000000..6cb690217 --- /dev/null +++ b/v4l/scripts/rmmod.pl @@ -0,0 +1,193 @@ +#!/usr/bin/perl +use strict; +use File::Find; + +my %depend = (); +my %depend2 = (); +my %rmlist = (); +my @nodep; +my @modlist; +my @allmodules; +my %reqmodules; +my %loaded = (); +my $i=0; + +# Device debug parameters +# Module name Debug option +my %debug = ( "tuner" => "tuner_debug=1", + "dvb-core" => "cam_debug=1", + "dvb-ttpci" => "debug=247", + "b2c2-flexcop" => "debug=0x01", + "b2c2-flexcop-usb" => "debug=0x01", + "b2c2-flexcop-pci" => "debug=0x01", + "dvb-usb" => "debug=0x33", + "dvb-usb-gp8psk" => "debug=0x03", + "dvb-usb-vp7045" => "debug=0x03", + "dvb-usb-dtt200u" => "debug=0x03", + "dvb-usb-dibusb-common" => "debug=0x03", + ); + + +sub parse_dir { + my $file = $File::Find::name; + + if (!($file =~ /[.]ko$/)) { + return; + } + + my $module = $file; + $module =~ s|^[./]*(.*)[.]ko|\1|; + + open IN, "modinfo $file|grep depends|cut -b 17-|"; + while (<IN>) { + my $deps = $_; + $deps =~ s/\n//; + $deps =~ s/[,]/ /g; + $deps = " $deps "; + $depend{$module} = $deps; + push @allmodules, $module; + $i++; + } + close IN; +} + +sub parse_loaded { + open IN, "/proc/modules"; + while (<IN>) { + m/^([\w\d_-]+)/; + $loaded{$1}=1; + } + close IN; +} + +sub cleandep() +{ + my $dep; + + while ( my ($k, $v) = each(%depend) ) { + my $arg=$v; + my $arg2=" "; + while (!($arg =~ m/^\s*$/)) { + if ($arg =~ m/^ ([^ ]+) /) { + my $val=$1; + if (exists($depend{$val})) { + $arg2="$arg2 $val "; + } else { + $reqmodules{$val}=1; + } + } + $arg =~ s/^ [^ ]+//; + $arg2 =~ s/\s\s+/ /; + } + $depend2 { $k } = $arg2; + } + +} + +sub rmdep() +{ + my $dep; + + while ($dep=pop @nodep) { + while ( my ($k, $v) = each(%depend2) ) { + if ($v =~ m/\s($dep)\s/) { + $v =~ s/\s${dep}\s/ /; + $v =~ s/\s${dep}\s/ /; + $v =~ s/\s${dep}\s/ /; + $depend2 {$k} = $v; + } + } + } +} + +sub orderdep () +{ + my $old; + do { + $old=$i; + while ( my ($key, $value) = each(%depend2) ) { + if ($value =~ m/^\s*$/) { + push @nodep, $key; + push @modlist, $key; + $i=$i-1; + delete $depend2 {$key}; + } + } + rmdep(); + } until ($old==$i); + while ( my ($key, $value) = each(%depend2) ) { + printf "ERROR: bad dependencies - $key ($value)\n"; + } +} + +sub insmod ($) +{ + my $debug=shift; + + while ( my ($key, $value) = each(%reqmodules) ) { + printf ("modprobe $key\n"); + system ("modprobe $key"); + } + + foreach my $key (@modlist) { + if ($debug) { + my $dbg=$debug{$key}; + + printf "insmod ./$key.ko $dbg\n"; + system "insmod ./$key.ko $dbg\n"; + } else { + printf "insmod ./$key.ko\n"; + system "insmod ./$key.ko\n"; + } + } +} + +sub rmmod () +{ + my $cmd="rmmod"; + while (my $key=pop @modlist) { + my $dep=$key; + $dep=~s/[\-]/_/g; + if (exists ($loaded{$dep})) { + printf "$cmd ./$key.ko\n"; + system "$cmd ./$key.ko\n"; + } + } +} + +sub prepare_cmd() +{ + find(\&parse_dir, "."); + printf "found $i modules\n"; + + cleandep(); + orderdep(); +} + +# main +my $mode=shift; +if ($mode eq "load") { + prepare_cmd; + insmod(0); +} else { + if ($mode eq "unload") { + prepare_cmd; + parse_loaded; + rmmod; + } else { + if ($mode eq "reload") { + prepare_cmd; + parse_loaded; + rmmod; + insmod(0); + } else { + if ($mode eq "debug") { + prepare_cmd; + parse_loaded; + insmod(1); + } else { + printf "Usage: $0 [load|unload|reload]\n"; + } + } + } +} |