diff options
Diffstat (limited to 'src/os/macos.rs')
-rw-r--r-- | src/os/macos.rs | 98 |
1 files changed, 1 insertions, 97 deletions
diff --git a/src/os/macos.rs b/src/os/macos.rs index 47248d0..cf68d04 100644 --- a/src/os/macos.rs +++ b/src/os/macos.rs @@ -1,49 +1,10 @@ -use ::pnet::datalink::Channel::Ethernet; -use ::pnet::datalink::DataLinkReceiver; -use ::pnet::datalink::{self, Config, NetworkInterface}; -use ::std::io::{self, stdin, Write}; -use ::termion::event::Event; -use ::termion::input::TermRead; - use ::std::collections::HashMap; -use ::std::net::IpAddr; - -use signal_hook::iterator::Signals; use crate::network::Connection; -use crate::OsInputOutput; use super::lsof_utils; use std::net::SocketAddr; -struct KeyboardEvents; - -impl Iterator for KeyboardEvents { - type Item = Event; - fn next(&mut self) -> Option<Event> { - match stdin().events().next() { - Some(Ok(ev)) => Some(ev), - _ => None, - } - } -} - -fn get_datalink_channel( - interface: &NetworkInterface, -) -> Result<Box<dyn DataLinkReceiver>, failure::Error> { - match datalink::channel(interface, Config::default()) { - Ok(Ethernet(_tx, rx)) => Ok(rx), - Ok(_) => failure::bail!("Unknown interface type"), - Err(e) => failure::bail!("Failed to listen to network interface: {}", e), - } -} - -fn get_interface(interface_name: &str) -> Option<NetworkInterface> { - datalink::interfaces() - .into_iter() - .find(|iface| iface.name == interface_name) -} - #[derive(Debug)] struct RawConnection { ip: String, @@ -53,7 +14,7 @@ struct RawConnection { process_name: String, } -fn get_open_sockets() -> HashMap<Connection, String> { +pub(crate) fn get_open_sockets() -> HashMap<Connection, String> { let mut open_sockets = HashMap::new(); let connections = lsof_utils::get_connections(); @@ -72,60 +33,3 @@ fn get_open_sockets() -> HashMap<Connection, String> { return open_sockets; } - -fn lookup_addr(ip: &IpAddr) -> Option<String> { - ::dns_lookup::lookup_addr(ip).ok() -} - -fn sigwinch() -> (Box<dyn Fn(Box<dyn Fn()>) + Send>, Box<dyn Fn() + Send>) { - let signals = Signals::new(&[signal_hook::SIGWINCH]).unwrap(); - let on_winch = { - let signals = signals.clone(); - move |cb: Box<dyn Fn()>| { - for signal in signals.forever() { - match signal { - signal_hook::SIGWINCH => cb(), - _ => unreachable!(), - } - } - } - }; - let cleanup = move || { - signals.close(); - }; - (Box::new(on_winch), Box::new(cleanup)) -} - -pub fn create_write_to_stdout() -> Box<dyn FnMut(String) + Send> { - Box::new({ - let mut stdout = io::stdout(); - move |output: String| { - writeln!(stdout, "{}", output).unwrap(); - } - }) -} - -pub fn get_input(interface_name: &str) -> Result<OsInputOutput, failure::Error> { - let keyboard_events = Box::new(KeyboardEvents); - let network_interface = match get_interface(interface_name) { - Some(interface) => interface, - None => { - failure::bail!("Cannot find interface {}", interface_name); - } - }; - let network_frames = get_datalink_channel(&network_interface)?; - let lookup_addr = Box::new(lookup_addr); - let write_to_stdout = create_write_to_stdout(); - let (on_winch, cleanup) = sigwinch(); - - Ok(OsInputOutput { - network_interface, - network_frames, - get_open_sockets, - keyboard_events, - lookup_addr, - on_winch, - cleanup, - write_to_stdout, - }) -} |