@@ -17,8 +17,8 @@ use pnet::packet::vlan::{ClassOfService, MutableVlanPacket};
1717use rand:: prelude:: * ;
1818
1919use crate :: args:: ScanOptions ;
20- use crate :: vendor:: Vendor ;
2120use crate :: utils;
21+ use crate :: vendor:: Vendor ;
2222use crate :: args:: ScanTiming ;
2323
2424pub const DATALINK_RCV_TIMEOUT : u64 = 500 ;
@@ -69,18 +69,25 @@ pub struct TargetDetails {
6969 * specific network on a network interfaces.
7070 */
7171pub fn compute_network_configuration < ' a > ( interfaces : & ' a [ NetworkInterface ] , scan_options : & ' a Arc < ScanOptions > ) -> ( & ' a NetworkInterface , Vec < & ' a IpNetwork > ) {
72- let selected_interface = match ( & scan_options. interface_name , & scan_options. interface_index ) {
72+
73+ let mut interface_name = scan_options. interface_name . clone ( ) ;
74+ if scan_options. interface_name . is_none ( ) && scan_options. interface_index . is_none ( ) {
75+ let default_name = utils:: select_default_interface ( interfaces) . map ( |interface| interface. name ) ;
76+ interface_name = default_name;
77+ }
78+
79+ let selected_interface = match ( interface_name, & scan_options. interface_index ) {
7380 ( Some ( interface_name) , _) => {
74- find_interface_by_name ( interfaces, interface_name)
81+ find_interface_by_name ( interfaces, & interface_name)
7582 } ,
7683 ( None , Some ( interface_index) ) => {
7784 find_interface_by_index ( interfaces, * interface_index)
7885 } ,
7986 _ => {
80- eprintln ! ( "Could not find a default network interface" ) ;
81- eprintln ! ( "Use 'arp scan -l' to list available interfaces" ) ;
82- process:: exit ( 1 ) ;
83- }
87+ eprintln ! ( "Could not find a default network interface" ) ;
88+ eprintln ! ( "Use 'arp scan -l' to list available interfaces" ) ;
89+ process:: exit ( 1 ) ;
90+ }
8491 } ;
8592
8693 let selected_interface = selected_interface. unwrap_or_else ( || {
@@ -97,12 +104,12 @@ pub fn compute_network_configuration<'a>(interfaces: &'a [NetworkInterface], sca
97104 ( selected_interface, ip_networks)
98105}
99106
100- fn find_interface_by_name < ' a > ( interfaces : & ' a [ NetworkInterface ] , interface_name : & str ) -> Option < & ' a NetworkInterface > {
107+ fn find_interface_by_name < ' a > ( interfaces : & ' a [ NetworkInterface ] , interface_name : & String ) -> Option < & ' a NetworkInterface > {
101108 interfaces. iter ( )
102- . find ( |interface| interface. name == interface_name && ( cfg ! ( windows) || interface. is_up ( ) ) && !interface. is_loopback ( ) )
109+ . find ( |interface| & interface. name == interface_name && ( cfg ! ( windows) || interface. is_up ( ) ) && !interface. is_loopback ( ) )
103110}
104111
105- fn find_interface_by_index < ' a > ( interfaces : & ' a [ NetworkInterface ] , interface_index : u32 ) -> Option < & ' a NetworkInterface > {
112+ fn find_interface_by_index ( interfaces : & [ NetworkInterface ] , interface_index : u32 ) -> Option < & NetworkInterface > {
106113 interfaces. iter ( )
107114 . find ( |interface| interface. index == interface_index && ( cfg ! ( windows) || interface. is_up ( ) ) && !interface. is_loopback ( ) )
108115}
0 commit comments