Skip to main content

fping/
args.rs

1use clap::Parser;
2use crate::constants::*;
3
4#[derive(Parser, Debug)]
5#[command(
6  name = "fping",
7  version = VERSION,
8  about = "Fast ping to multiple hosts")]
9
10pub struct Args {
11  /// Target hosts
12  pub targets: Vec<String>,
13
14  /// Count mode: send N pings to each target
15  #[arg(short = 'c', long, value_name = "N")]
16  pub count: Option<u32>,
17
18  /// Same as -c but verbose output (all RTTs)
19  #[arg(short = 'C', long = "vcount", value_name = "N")]
20  pub vcount: Option<u32>,
21
22  /// Loop mode: send pings forever
23  #[arg(short = 'l', long)]
24  pub r#loop: bool,
25
26  /// Interval between packets in ms (default: 10)
27  #[arg(short = 'i', long, value_name = "MSEC", default_value = "10")]
28  pub interval: u64,
29
30  /// Per-host interval in ms (default: 1000)
31  #[arg(short = 'p', long, value_name = "MSEC", default_value = "1000")]
32  pub period: u64,
33
34  /// Timeout in ms (default: 500)
35  #[arg(short = 't', long, value_name = "MSEC", default_value = "500")]
36  pub timeout: u64,
37
38  /// Number of retries (default: 3)
39  #[arg(short = 'r', long, default_value = "3")]
40  pub retry: u32,
41
42  /// Exponential backoff factor (default: 1.5)
43  #[arg(short = 'B', long, default_value = "1.5")]
44  pub backoff: f64,
45
46  /// Ping data size in bytes (default: 56)
47  #[arg(short = 'b', long = "size", value_name = "BYTES", default_value = "56")]
48  pub size: usize,
49
50  /// Read hosts from file (- = stdin)
51  #[arg(short = 'f', long, value_name = "FILE")]
52  pub file: Option<String>,
53
54  /// Show only alive hosts
55  #[arg(short = 'a', long)]
56  pub alive: bool,
57
58  /// Show only unreachable hosts
59  #[arg(short = 'u', long)]
60  pub unreach: bool,
61
62  /// Quiet: don't show per-ping results
63  #[arg(short = 'q', long)]
64  pub quiet: bool,
65
66  /// Print final stats
67  #[arg(short = 's', long)]
68  pub stats: bool,
69
70  /// Show elapsed time on received packets
71  #[arg(short = 'e', long)]
72  pub elapsed: bool,
73
74  /// Show targets by address
75  #[arg(short = 'A', long)]
76  pub addr: bool,
77
78  /// Timestamp before each line
79  #[arg(short = 'D', long)]
80  pub timestamp: bool,
81
82  /// JSON output (requires -c, -C or -l)
83  #[arg(short = 'J', long)]
84  pub json: bool,
85
86  /// Use IPv4 only
87  #[arg(short = '4', long)]
88  pub ipv4: bool,
89
90  /// Use IPv6 only
91  #[arg(short = '6', long)]
92  pub ipv6: bool,
93
94  /// Show all individual RTTs
95  #[arg(long = "report-all-rtts")]
96  pub report_all_rtts: bool,
97
98  /// Minimum number of reachable hosts to be considered success
99  #[arg(short = 'x', long = "reachable", value_name = "N")]
100  pub reachable: Option<u32>,
101}
102
103impl Args {
104  pub fn effective_count(&self) -> Option<u32> {
105    self.vcount.or(self.count)
106  }
107
108  /// Ist verbose-count aktiv?
109  pub fn is_verbose_count(&self) -> bool {
110    self.vcount.is_some()
111  }
112}