summaryrefslogtreecommitdiffstats
path: root/lib/network/connection/dvb.pm
blob: ec085b3b8b57ae64ba6b110085fa43b51b471c45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package network::connection::dvb;

use strict;
use common;

use base qw(network::connection::ethernet);

use strict;
use common;
use modules;

sub get_type_name() { N("DVB") }
sub get_type_description() { N("Satellite (DVB)") }
sub get_type_icon() { 'dvb-24' }

sub get_devices() {
    require detect_devices;
    detect_devices::probe_category("multimedia/dvb");
}

sub get_metric { 15 }

sub handles_ifcfg {
    my ($_class, $ifcfg) = @_;
    exists $ifcfg->{DVB_ADAPTER_ID};
}

sub get_interface {
    my ($self) = @_;
    defined $self->{hardware}{adapter_id} && defined $self->{hardware}{network_demux} or return "dvb";
    'dvb' . $self->{hardware}{adapter_id} . '_' . $self->{hardware}{network_demux};
}

sub get_dvb_device {
    find { sysopen(undef, $_, c::O_RDWR() | c::O_NONBLOCK()) } glob("/dev/dvb/adapter*/net*");
}

sub load_interface_settings {
    my ($self) = @_;
    $self->guess_hardware_settings; #- so that matching interface settings can be loaded
    $self->network::connection::load_interface_settings;
    $self->{hardware}{adapter_id} = $self->{ifcfg}{DVB_ADAPTER_ID};
    $self->{hardware}{network_demux} = $self->{ifcfg}{DVB_NETWORK_DEMUX};
    $self->{hardware}{network_pid} = $self->{ifcfg}{DVB_NETWORK_PID};
}

sub guess_hardware_settings {
    my ($self) = @_;
    my $device = get_dvb_device() or return;
    ($self->{hardware}{adapter_id}, $self->{hardware}{network_demux}) = $device =~ m,/dev/dvb/adapter(\d+)/net(\d+),;
}

sub get_hardware_settings {
   my ($self) = @_;
   [
       { label => N("Adapter card"), val => \$self->{hardware}{adapter_id} },
       { label => N("Net demux"), val => \$self->{hardware}{network_demux} },
       { label => N("PID"), val => \$self->{hardware}{network_pid} },
   ];
}

sub build_ifcfg_settings {
    my ($self) = @_;
    my $settings = {
        DVB_ADAPTER_ID => qq("$self->{hardware}{adapter_id}"),
        DVB_NETWORK_DEMUX => qq("$self->{hardware}{network_demux}"),
        DVB_NETWORK_PID => qq("$self->{hardware}{network_pid}"),
        MII_NOT_SUPPORTED => "yes",
    };
    $self->SUPER::build_ifcfg_settings($settings);
}

1;