From 197f75c7c5d0b4dab1f92a739dc1be0d90f5b27d Mon Sep 17 00:00:00 2001 From: ache Date: Sun, 16 Aug 2026 20:55:33 +0200 Subject: feat: Add support for default target and implement robust target resolution Introduces a new `--default-target` argument to allow specifying a default host address. In case that target isn't defined, as a configuration option. --- src/args.rs | 4 ++++ 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, + /// Target IP address #[arg(value_name = "target")] pub target: Option, 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, @@ -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); -- cgit v1.3-2-g11bf