diff --git a/apply.pl b/apply.pl index 576fd3f..ab32dc5 100644 --- a/apply.pl +++ b/apply.pl @@ -109,6 +109,11 @@ sub handle_request() { delconfigline( '4 ' . $c[2] ); } + if( defined( $p{interface_manual} ) && $p{interface_manual} ne '' ) + { + $p{interface} = $p{interface_manual}; + } + $p{interface} =~ s/[^-_\.A-Za-z0-9:\*]//g; if( $p{number} ne '' ) { addconfigline( '4 ' . $p{number} . ' ' . $p{interface} . ' ' . $p{frametype} . ' ' . $p{delay} ); diff --git a/settings.pl b/settings.pl index 82b03d9..6cb83f2 100644 --- a/settings.pl +++ b/settings.pl @@ -22,6 +22,61 @@ # # + +sub html_escape( $ ) +{ + my $s = $_[0]; + $s = '' unless defined $s; + $s =~ s/&/&/g; + $s =~ s/</g; + $s =~ s/>/>/g; + $s =~ s/"/"/g; + return $s; +} + +sub network_interface_options( $ ) +{ + my $current = $_[0]; + my @interfaces = (); + my %seen = (); + my $html = ''; + + $current = '' unless defined $current; + + if( opendir( my $dh, '/sys/class/net' ) ) + { + foreach my $ifname ( sort readdir( $dh ) ) + { + next if $ifname =~ /^\./; + next if $ifname =~ /[^-_\.A-Za-z0-9]/; + next if $seen{$ifname}; + push( @interfaces, $ifname ); + $seen{$ifname} = 1; + } + closedir( $dh ); + } + + # Keep special/manual values usable even if they are not real kernel interfaces. + foreach my $ifname ( '*', 'auto', $current ) + { + next if !defined( $ifname ) || $ifname eq ''; + next if $seen{$ifname}; + push( @interfaces, $ifname ); + $seen{$ifname} = 1; + } + + foreach my $ifname ( @interfaces ) + { + my $selected = ( $ifname eq $current ) ? ' SELECTED' : ''; + my $label = $ifname; + $label = '* (all interfaces)' if $ifname eq '*'; + $label = 'auto' if $ifname eq 'auto'; + $html .= '\t\t\t\t\n'; + } + + return $html; +} + sub handle_request() { if( $c[1] eq 'general' ) @@ -1385,6 +1440,7 @@ EOF { $c = getconfigline( '4 ' . $c[2] ); @c = split( ' ', $c ); + $interface_options = network_interface_options( $c[1] ); $c[2] =~ s/\.//g; eval( '$frametype_' . $c[2] . ' = " SELECTED";' ); @@ -1453,7 +1509,10 @@ TT { color:#5b4b38; } Network interface: