diff options
author | metamuffin <metamuffin@disroot.org> | 2025-07-07 23:51:19 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-07-07 23:51:24 +0200 |
commit | ac1ecb0876d57d73cee54127f5ba793095808b92 (patch) | |
tree | a2489ac8b91ed877db0c0c729b6d95ef732bbfde /server | |
parent | d21f0fa8363a0d48c6b6cd0c0589c012e7fe7bf5 (diff) | |
download | hurrycurry-ac1ecb0876d57d73cee54127f5ba793095808b92.tar hurrycurry-ac1ecb0876d57d73cee54127f5ba793095808b92.tar.bz2 hurrycurry-ac1ecb0876d57d73cee54127f5ba793095808b92.tar.zst |
server mdns prevent advertising not supported ip versions
Diffstat (limited to 'server')
-rw-r--r-- | server/src/main.rs | 2 | ||||
-rw-r--r-- | server/src/network/mdns.rs | 15 |
2 files changed, 11 insertions, 6 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index 7fbc044a..c5f28ed8 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -172,7 +172,7 @@ async fn run(args: Args) -> anyhow::Result<()> { if args.mdns { tokio::task::spawn(hurrycurry_server::network::mdns::mdns_loop( args.server_name.clone(), - args.listen.port(), + args.listen, state.clone(), )); } diff --git a/server/src/network/mdns.rs b/server/src/network/mdns.rs index 43f7bc91..5bd71c60 100644 --- a/server/src/network/mdns.rs +++ b/server/src/network/mdns.rs @@ -22,10 +22,10 @@ use hurrycurry_protocol::VERSION; use log::{info, warn}; use mdns_sd::{ServiceDaemon, ServiceInfo}; use rand::random; -use std::{collections::HashMap, sync::Arc, time::Duration}; +use std::{collections::HashMap, net::SocketAddr, sync::Arc, time::Duration}; use tokio::{sync::RwLock, time::interval}; -pub async fn mdns_loop(name: String, port: u16, state: Arc<RwLock<Server>>) { +pub async fn mdns_loop(name: String, listen_addr: SocketAddr, state: Arc<RwLock<Server>>) { let d = match ServiceDaemon::new() { Ok(d) => d, Err(e) => { @@ -37,7 +37,7 @@ pub async fn mdns_loop(name: String, port: u16, state: Arc<RwLock<Server>>) { let hostname = format!("hks-{}.local.", random::<u64>()); loop { interval.tick().await; - if let Err(e) = update_service(&d, &state, &name, &hostname, port).await { + if let Err(e) = update_service(&d, &state, &name, &hostname, listen_addr).await { warn!("mDNS service update failed: {e}"); } info!("updated mDNS service record"); @@ -49,12 +49,17 @@ async fn update_service( state: &Arc<RwLock<Server>>, name: &str, hostname: &str, - port: u16, + listen_addr: SocketAddr, ) -> Result<()> { let addrs = get_if_addrs()? .into_iter() .map(|e| e.addr.ip()) .filter(|a| !a.is_loopback()) + .filter(|a| { + (a.is_ipv6() && listen_addr.is_ipv6()) + || (a.is_ipv4() && listen_addr.is_ipv4()) + || (a.is_ipv4() && listen_addr.is_ipv6() && !cfg!(windows)) + }) .collect::<Vec<_>>(); let players = state.read().await.count_chefs(); @@ -64,7 +69,7 @@ async fn update_service( name, hostname, &*addrs, - port, + listen_addr.port(), HashMap::from_iter([ ("players".to_string(), players.to_string()), ("version".to_string(), env!("CARGO_PKG_VERSION").to_string()), |