From 74b595492ac13b1468d7f2a0c235d9d7276f8ef3 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Sat, 20 Jun 2026 16:56:21 +0200 Subject: [PATCH] refactor: Move network listener CLI args into struct --- breakwater/src/cli_args.rs | 40 ++++++++++++++++++++++---------------- breakwater/src/main.rs | 16 +++++++++------ 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/breakwater/src/cli_args.rs b/breakwater/src/cli_args.rs index 806fb1f..3e47996 100644 --- a/breakwater/src/cli_args.rs +++ b/breakwater/src/cli_args.rs @@ -10,10 +10,8 @@ pub const DEFAULT_NETWORK_BUFFER_SIZE_STR: &str = formatcp!("{}", DEFAULT_NETWOR #[derive(clap::Parser, Debug)] #[clap(author, version, about, long_about = None)] pub struct CliArgs { - /// Listen address to bind to (multiple can be specified). - /// The default value will listen on all interfaces for IPv4 and IPv6 packets. - #[clap(short, long = "listener-address", default_value = "[::]:1234")] - pub listen_addresses: Vec, + #[clap(flatten)] + pub network_listener: NetworkListenerCliArgs, /// Width of the drawing surface. #[clap(long, default_value_t = 1280)] @@ -27,15 +25,6 @@ pub struct CliArgs { #[clap(short, long, default_value_t = 30)] pub fps: u32, - /// The size in bytes of the network buffer used for each open TCP connection. - /// Please use at least 64 KB (64_000 bytes). - #[clap( - long, - default_value = DEFAULT_NETWORK_BUFFER_SIZE_STR, - value_parser = 64_000..100_000_000, - )] - pub network_buffer_size: i64, - /// Listen address the Prometheus exporter should listen on. #[clap(short, long, default_value = "[::]:9100")] pub prometheus_listen_address: String, @@ -54,10 +43,6 @@ pub struct CliArgs { #[clap(long)] pub disable_statistics_save_file: bool, - /// Allow only a certain number of connections per ip address - #[clap(short, long)] - pub connections_per_ip: Option, - /// Create (or use an existing) shared memory region for the framebuffer. /// This enables other applications to read and write Pixel values to the framebuffer or can be /// used to persist the canvas across restarts. @@ -67,3 +52,24 @@ pub struct CliArgs { #[clap(flatten)] pub sinks: SinkCliArgs, } + +#[derive(clap::Args, Debug)] +pub struct NetworkListenerCliArgs { + /// Listen address to bind to (multiple can be specified). + /// The default value will listen on all interfaces for IPv4 and IPv6 packets. + #[clap(short, long = "listener-address", default_value = "[::]:1234")] + pub listen_addresses: Vec, + + /// The size in bytes of the network buffer used for each open TCP connection. + /// Please use at least 64 KB (64_000 bytes). + #[clap( + long, + default_value = DEFAULT_NETWORK_BUFFER_SIZE_STR, + value_parser = 64_000..100_000_000, + )] + pub network_buffer_size: i64, + + /// Allow only a certain number of connections per ip address + #[clap(short, long)] + pub connections_per_ip: Option, +} diff --git a/breakwater/src/main.rs b/breakwater/src/main.rs index ee083ea..29290db 100644 --- a/breakwater/src/main.rs +++ b/breakwater/src/main.rs @@ -75,16 +75,20 @@ async fn main() -> eyre::Result<()> { )?; let mut server = Server::new( - &args.listen_addresses, + &args.network_listener.listen_addresses, fb.clone(), statistics_tx.clone(), - args.network_buffer_size + args.network_listener + .network_buffer_size .try_into() // This should never happen as clap checks the range for us .with_context(|| { - format!("invalid network buffer size: {}", args.network_buffer_size) + format!( + "invalid network buffer size: {}", + args.network_listener.network_buffer_size + ) })?, - args.connections_per_ip, + args.network_listener.connections_per_ip, ) .await .context("failed to start pixelflut server")?; @@ -104,7 +108,7 @@ async fn main() -> eyre::Result<()> { let (sink_tasks, ffmpeg_thread_present) = start_sinks( &args.sinks, fb.clone(), - &args.listen_addresses, + &args.network_listener.listen_addresses, args.fps, statistics_tx, statistics_information_rx, @@ -123,7 +127,7 @@ async fn main() -> eyre::Result<()> { .context("failed to stop sink")?; } - // We need to stop this thread as the last, as others always try to send statistics to it + // We need to stop this thread last, as others always try to send statistics to it statistics_thread.abort(); if ffmpeg_thread_present {