diff options
| -rw-r--r-- | src/args.rs | 4 | ||||
| -rw-r--r-- | src/main.rs | 46 |
2 files changed, 30 insertions, 20 deletions
diff --git a/src/args.rs b/src/args.rs index 7004791..6fdca59 100644 --- a/src/args.rs +++ b/src/args.rs @@ -37,6 +37,10 @@ pub struct Args { #[arg(short = 'r', long = "remainder", action = ArgAction::SetTrue)] pub remainder: bool, + /// Default target, if none is specified + #[arg(long = "default-target", value_name = "default_target")] + pub default_target: Option<String>, + /// Target IP address #[arg(value_name = "target")] pub target: Option<String>, diff --git a/src/main.rs b/src/main.rs index 99db51b..ee5add6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,29 @@ use print::{print_legende_line, print_ping_line, print_stats}; use state::State; use stats::compute_stats; +fn parse_target(target_str: &str) -> IpAddr { + if let Ok(ip) = parse_ip(target_str) { + ip + } else { + // Try DNS resolution + let dns_str = format!("{}:0", target_str); + match dns_str.to_socket_addrs() { + Ok(mut addrs) => { + if let Some(addr) = addrs.next() { + addr.ip() + } else { + eprintln!("Error: no DNS addresses found"); + std::process::exit(1); + } + } + Err(e) => { + eprintln!("Error: DNS resolution failed: {}", e); + std::process::exit(1); + } + } + } +} + fn main_loop( args: &Args, states: &mut Vec<State>, @@ -109,26 +132,9 @@ async fn main() { let args = Args::parse(); let target: IpAddr = if let Some(target_str) = args.target.clone() { - if let Ok(ip) = parse_ip(&target_str) { - ip - } else { - // Try DNS resolution - let dns_str = format!("{}:0", target_str); - match dns_str.to_socket_addrs() { - Ok(mut addrs) => { - if let Some(addr) = addrs.next() { - addr.ip() - } else { - eprintln!("Error: no DNS addresses found"); - std::process::exit(1); - } - } - Err(e) => { - eprintln!("Error: DNS resolution failed: {}", e); - std::process::exit(1); - } - } - } + parse_target(&target_str) + } else if let Some(default_target_str) = args.default_target.clone() { + parse_target(&default_target_str) } else { eprintln!("Error: target address is required"); std::process::exit(1); |