use std::process::Command;
use super::ConnectionInfo;
#[cfg(target_os = "linux")]
use super::{parse_netstat_output, parse_ss_output};
#[cfg(target_os = "macos")]
use super::parse_lsof_output;
pub fn get_connections() -> Vec<ConnectionInfo> {
#[cfg(target_os = "linux")]
{
get_connections_linux()
}
#[cfg(target_os = "macos")]
{
get_connections_macos()
}
}
#[cfg(target_os = "linux")]
fn get_connections_linux() -> Vec<ConnectionInfo> {
if let Ok(output) = Command::new("ss").args(["-tunp"]).output() {
let text = String::from_utf8_lossy(&output.stdout);
let conns = parse_ss_output(&text);
if !conns.is_empty() {
return conns;
}
}
if let Ok(output) = Command::new("netstat").args(["-tunp"]).output() {
let text = String::from_utf8_lossy(&output.stdout);
return parse_netstat_output(&text);
}
Vec::new()
}
#[cfg(target_os = "macos")]
fn get_connections_macos() -> Vec<ConnectionInfo> {
let output = match Command::new("lsof")
.args(["-i", "TCP", "-i", "UDP", "-P", "-n"])
.output()
{
Ok(o) => o,
Err(_) => return Vec::new(),
};
let text = String::from_utf8_lossy(&output.stdout);
parse_lsof_output(&text)
}