aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorache <ache@ache.one>2026-08-16 20:55:33 +0200
committerache <ache@ache.one>2026-08-16 20:55:33 +0200
commit197f75c7c5d0b4dab1f92a739dc1be0d90f5b27d (patch)
tree40cce77ff65e30c2484f8864f12c60003807cab1
parentResolve DNS target (diff)
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.
-rw-r--r--src/args.rs4
-rw-r--r--src/main.rs46
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);