diff options
Diffstat (limited to 'perl-install/modalias.pm')
| -rw-r--r-- | perl-install/modalias.pm | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/perl-install/modalias.pm b/perl-install/modalias.pm index 3ff863e30..e1b61edc0 100644 --- a/perl-install/modalias.pm +++ b/perl-install/modalias.pm @@ -13,6 +13,11 @@ my @config_groups = ( "/etc/modprobe.conf", "/etc/modprobe.d", ], +); +my @system_groups = ( + [ + "/lib/module-init-tools/ldetect-lst-modules.alias", + ], [ "/lib/modules/" . c::kernel_version() . "/modules.alias", ], @@ -20,6 +25,8 @@ my @config_groups = ( my @classes = qw(ide ieee1394 input pci pcmcia pnp serio usb); my @alias_groups; +my $alias_re = qr/^\s*alias\s+(([^:]+):\S+)\s+(\S+)$/; + sub alias_to_ids { my ($alias) = @_; my ($vendor, $device); @@ -37,9 +44,9 @@ sub parse_path { parse_path($group, "$path/$_") foreach all($path); } elsif (-f $path) { foreach (cat_($path)) { - if (my ($alias, $class, $module) = /^\s*alias\s+(([^:]+):\S+)\s+(\S+)$/) { - my ($vendor, $device) = alias_to_ids($alias); + if (my ($alias, $class, $module) = $_ =~ $alias_re) { if (member($class, @classes)) { + my ($vendor, $device) = alias_to_ids($alias); if ($vendor) { $group->{$class} ||= {}; $group->{$class}{$vendor} ||= {}; @@ -54,23 +61,36 @@ sub parse_path { } } -sub get_alias_groups() { +sub parse_file_modules { + my ($path) = @_; + my %modules; + foreach (cat_($path)) { + if (my ($alias, undef, $module) = $_ =~ $alias_re) { + push @{$modules{$module}}, $alias; + } + } + \%modules; +} + +sub get_alias_groups { + my ($o_skip_config) = @_; + #- FIXME: only o_skip_config from the first call is considered @alias_groups = map { my $group = {}; parse_path($group, $_) foreach @$_; $group; - } @config_groups unless @alias_groups; + } if_(!$o_skip_config, @config_groups), @system_groups unless @alias_groups; @alias_groups; } sub get_modules { - my ($modalias) = @_; + my ($modalias, $o_skip_config) = @_; my ($class) = $modalias =~ /^([^:]+):\S+$/; my ($vendor, $device) = alias_to_ids($modalias); $class && member($class, @classes) or return; require File::FnMatch; - foreach my $group (get_alias_groups()) { + foreach my $group (get_alias_groups($o_skip_config)) { my @aliases; foreach my $subgroup ($group->{$class}{$vendor}{$device}, $group->{$class}{other}) { foreach (group_by2(@$subgroup)) { |
