From 627bf71703e8beaa7583a3ed694f6167f6dcb4ce Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Sat, 5 Jul 2025 11:53:55 -0700 Subject: [PATCH] add errors for IP --- src/error.rs | 7 +++++-- src/main.rs | 47 ++++++++++++++++++++++------------------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/error.rs b/src/error.rs index b73215a..5473ff8 100644 --- a/src/error.rs +++ b/src/error.rs @@ -39,8 +39,11 @@ pub enum LocalSendError { #[error("Cancel Failed")] CancelFailed, - #[error("No broadcast IP available")] - NoBroadcastIP, + #[error("IPv6 is not supported")] + IPv6Unsupported, + + #[error("Error getting local IP")] + IpAddrError(#[from] local_ip_address::Error), } pub type Result = std::result::Result; diff --git a/src/main.rs b/src/main.rs index 4d6afa1..dea0991 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,4 @@ -#![feature(ip_as_octets)] -#![feature(slice_as_array)] -use std::net::Ipv4Addr; - -use joecalsend::{Client, error, models::device::DeviceInfo}; +use joecalsend::{Client, JoecalState, error, models::device::DeviceInfo}; use local_ip_address::local_ip; use network_interface::{Addr, NetworkInterface, NetworkInterfaceConfig, V4IfAddr}; @@ -11,31 +7,32 @@ async fn main() -> error::Result<()> { let device = DeviceInfo::default(); dbg!(&device); + let std::net::IpAddr::V4(ip) = local_ip()? else { + unreachable!() + }; + + // for enumerating subnet peers when multicast fails (https://github.com/localsend/protocol?tab=readme-ov-file#32-http-legacy-mode) + let mut network_ip = ip; + let nifs = NetworkInterface::show().unwrap(); + for addr in nifs.into_iter().flat_map(|i| i.addr) { + if let Addr::V4(V4IfAddr { + ip: ifip, + netmask: Some(netmask), + .. + }) = addr + && ip == ifip + { + network_ip = ip & netmask; + break; + } + } + dbg!(network_ip); + let client = Client::with_config(device, 53317, "/home/ardent/joecalsend".into()) .await .unwrap(); let (h1, h2, h3) = client.start().await.unwrap(); - let ip = local_ip().unwrap(); - if !ip.is_ipv4() { - return Err(error::LocalSendError::NoBroadcastIP); - } - let local_device_ip = Ipv4Addr::from_bits(u32::from_be_bytes( - ip.as_octets().as_array().unwrap().to_owned(), - )); - let nifs = NetworkInterface::show().unwrap(); - let mut mask = Ipv4Addr::from_bits(u32::MAX); - 'outer: for nif in nifs { - for addr in nif.addr { - if let Addr::V4(V4IfAddr { ip, netmask, .. }) = addr - && ip == local_device_ip - { - mask = netmask.unwrap_or(mask); - break 'outer; - } - } - } - dbg!(mask); let _ = tokio::join!(h1, h2, h3); Ok(())