]> code.octet-stream.net Git - netwatcher/commitdiff
Make some error cases more specific
authorThomas Karpiniec <tom.karpiniec@outlook.com>
Wed, 26 Jun 2024 10:26:26 +0000 (20:26 +1000)
committerThomas Karpiniec <tom.karpiniec@outlook.com>
Wed, 26 Jun 2024 10:26:26 +0000 (20:26 +1000)
src/lib.rs
src/list_unix.rs
src/watch_linux.rs
src/watch_mac.rs

index 08a0a36b2d48b8593bd90adc331f759d6af3ef8d..6d22c98d391fb37b1f241d850349f69b29ee8297 100644 (file)
@@ -4,13 +4,18 @@ use std::{
     ops::Sub,
 };
 
     ops::Sub,
 };
 
+use nix::errno::Errno;
+
 #[cfg_attr(windows, path = "list_win.rs")]
 #[cfg_attr(unix, path = "list_unix.rs")]
 mod list;
 
 #[cfg_attr(windows, path = "watch_win.rs")]
 #[cfg_attr(target_vendor = "apple", path = "watch_mac.rs")]
 #[cfg_attr(windows, path = "list_win.rs")]
 #[cfg_attr(unix, path = "list_unix.rs")]
 mod list;
 
 #[cfg_attr(windows, path = "watch_win.rs")]
 #[cfg_attr(target_vendor = "apple", path = "watch_mac.rs")]
-#[cfg_attr(any(target_os = "linux", target_os = "android"), path = "watch_linux.rs")]
+#[cfg_attr(
+    any(target_os = "linux", target_os = "android"),
+    path = "watch_linux.rs"
+)]
 mod watch;
 
 type IfIndex = u32;
 mod watch;
 
 type IfIndex = u32;
@@ -71,7 +76,12 @@ pub struct InterfaceDiff {
 /// Errors in netwatcher or in one of the underlying platform integratinos.
 #[derive(Debug, Clone, PartialEq, Eq)]
 pub enum Error {
 /// Errors in netwatcher or in one of the underlying platform integratinos.
 #[derive(Debug, Clone, PartialEq, Eq)]
 pub enum Error {
-    // TODO: handle all cases with proper sources
+    CreateSocket(Errno),
+    Bind(Errno),
+    CreatePipe(Errno),
+    Getifaddrs(Errno),
+    GetInterfaceName(Errno),
+    FormatMacAddress,
     Internal,
 }
 
     Internal,
 }
 
index fad43067b0374f353c74c6ed067ff3f31ba72ffc..a7cd8815553ca865ca8cfb38581e22d0d04f0a31 100644 (file)
@@ -13,11 +13,12 @@ struct CandidateInterface {
 }
 
 pub(crate) fn list_interfaces() -> Result<List, Error> {
 }
 
 pub(crate) fn list_interfaces() -> Result<List, Error> {
-    let addrs = getifaddrs().map_err(|_| Error::Internal)?;
+    let addrs = getifaddrs().map_err(|e| Error::Getifaddrs(e))?;
     let mut candidates = HashMap::new();
 
     for addr in addrs {
     let mut candidates = HashMap::new();
 
     for addr in addrs {
-        let index = if_nametoindex(addr.interface_name.as_str()).map_err(|_| Error::Internal)?;
+        let index =
+            if_nametoindex(addr.interface_name.as_str()).map_err(|e| Error::GetInterfaceName(e))?;
         let candidate = candidates
             .entry(addr.interface_name.clone())
             .or_insert_with(|| CandidateInterface {
         let candidate = candidates
             .entry(addr.interface_name.clone())
             .or_insert_with(|| CandidateInterface {
@@ -64,9 +65,9 @@ fn format_mac(bytes: &[u8]) -> Result<String, Error> {
     let mut mac = String::with_capacity(bytes.len() * 3);
     for (i, b) in bytes.iter().enumerate() {
         if i != 0 {
     let mut mac = String::with_capacity(bytes.len() * 3);
     for (i, b) in bytes.iter().enumerate() {
         if i != 0 {
-            write!(mac, ":").map_err(|_| Error::Internal)?;
+            write!(mac, ":").map_err(|_| Error::FormatMacAddress)?;
         }
         }
-        write!(mac, "{:02X}", b).map_err(|_| Error::Internal)?;
+        write!(mac, "{:02X}", b).map_err(|_| Error::FormatMacAddress)?;
     }
     Ok(mac)
 }
     }
     Ok(mac)
 }
index c1f08a25b40d1a973bec553041a24bc77105a486..e8e1ffc6350236c4a5a3d96ea8378ea4d280f1de 100644 (file)
@@ -44,13 +44,14 @@ fn start_watcher_thread<F: FnMut(Update) + Send + 'static>(
         SockFlag::empty(),
         Some(SockProtocol::NetlinkRoute),
     )
         SockFlag::empty(),
         Some(SockProtocol::NetlinkRoute),
     )
-    .map_err(|_| Error::Internal)?; // TODO: proper errors
+    .map_err(|e| Error::CreateSocket(e))?;
+    // TODO: set nonblocking
     let sa_nl = NetlinkAddr::new(
         0,
         (RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR) as u32,
     );
     let sa_nl = NetlinkAddr::new(
         0,
         (RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR) as u32,
     );
-    bind(sockfd.as_raw_fd(), &sa_nl).map_err(|_| Error::Internal)?; // TODO: proper errors
-    let (pipe_rd, pipe_wr) = pipe().map_err(|_| Error::Internal)?;
+    bind(sockfd.as_raw_fd(), &sa_nl).map_err(|e| Error::Bind(e))?;
+    let (pipe_rd, pipe_wr) = pipe().map_err(|e| Error::CreatePipe(e))?;
 
     let mut prev_list = List::default();
     let mut handle_update = move |new_list: List| {
 
     let mut prev_list = List::default();
     let mut handle_update = move |new_list: List| {
index de0e65024c27c8b912832a4775f7ac7413d38833..42e7217ad46a09f33c1ce9277da588ce6ac283e9 100644 (file)
@@ -42,7 +42,9 @@ pub(crate) struct WatchHandle {
 
 impl Drop for WatchHandle {
     fn drop(&mut self) {
 
 impl Drop for WatchHandle {
     fn drop(&mut self) {
-        unsafe { nw_path_monitor_cancel(self.path_monitor); }
+        unsafe {
+            nw_path_monitor_cancel(self.path_monitor);
+        }
     }
 }
 
     }
 }
 
@@ -83,7 +85,5 @@ pub(crate) fn watch_interfaces<F: FnMut(Update) + Send + 'static>(
         nw_path_monitor_set_queue(path_monitor, queue);
         nw_path_monitor_start(path_monitor);
     }
         nw_path_monitor_set_queue(path_monitor, queue);
         nw_path_monitor_start(path_monitor);
     }
-    Ok(WatchHandle {
-        path_monitor,
-    })
+    Ok(WatchHandle { path_monitor })
 }
 }