diff --git a/zeroconf/src/linux/entry_group.rs b/zeroconf/src/linux/entry_group.rs index a72c4b8..4e68fb0 100644 --- a/zeroconf/src/linux/entry_group.rs +++ b/zeroconf/src/linux/entry_group.rs @@ -1,6 +1,5 @@ //! Rust friendly `AvahiEntryGroup` wrappers/helpers -use super::avahi_util; use crate::Result; use avahi_sys::{ avahi_entry_group_add_service, avahi_entry_group_commit, avahi_entry_group_free, @@ -60,7 +59,7 @@ impl ManagedAvahiEntryGroup { port, }: AddServiceParams, ) -> Result<()> { - let err = unsafe { + avahi!( avahi_entry_group_add_service( self.0, interface, @@ -72,24 +71,11 @@ impl ManagedAvahiEntryGroup { host, port, ptr::null_mut() as *const c_char, // null terminated txt record list - ) - }; + ), + "could not register service" + )?; - if err < 0 { - return Err(format!( - "could not register service: `{}`", - avahi_util::get_error(err) - ) - .into()); - } - - let err = unsafe { avahi_entry_group_commit(self.0) }; - - if err < 0 { - Err(format!("could not commit service: `{}`", avahi_util::get_error(err)).into()) - } else { - Ok(()) - } + avahi!(avahi_entry_group_commit(self.0), "could not commit service") } /// Delegate function for [`avahi_entry_group_reset()`]. diff --git a/zeroconf/src/linux/poll.rs b/zeroconf/src/linux/poll.rs index 679d678..acb6f9b 100644 --- a/zeroconf/src/linux/poll.rs +++ b/zeroconf/src/linux/poll.rs @@ -1,6 +1,5 @@ //! Rust friendly `AvahiSimplePoll` wrappers/helpers -use super::avahi_util; use crate::Result; use avahi_sys::{ avahi_simple_poll_free, avahi_simple_poll_iterate, avahi_simple_poll_loop, @@ -30,16 +29,10 @@ impl ManagedAvahiSimplePoll { /// /// [`avahi_simple_poll_loop()`]: https://avahi.org/doxygen/html/simple-watch_8h.html#a14b4cb29832e8c3de609d4c4e5611985 pub fn start_loop(&self) -> Result<()> { - let err = unsafe { avahi_simple_poll_loop(self.0) }; - if err != 0 { - Err(format!( - "could not start AvahiSimplePoll: {}", - avahi_util::get_error(err) - ) - .into()) - } else { - Ok(()) - } + avahi!( + avahi_simple_poll_loop(self.0), + "could not start AvahiSimplePoll" + ) } /// Delegate function for [`avahi_simple_poll_iterate()`]. diff --git a/zeroconf/src/linux/string_list.rs b/zeroconf/src/linux/string_list.rs index 10379cf..4854969 100644 --- a/zeroconf/src/linux/string_list.rs +++ b/zeroconf/src/linux/string_list.rs @@ -128,33 +128,35 @@ mod tests { let key1 = c_string!("foo"); let value1 = c_string!("bar"); - list.add_pair( - key1.as_ptr() as *const c_char, - value1.as_ptr() as *const c_char, - ); + unsafe { + list.add_pair( + key1.as_ptr() as *const c_char, + value1.as_ptr() as *const c_char, + ); - let key2 = c_string!("hello"); - let value2 = c_string!("world"); + let key2 = c_string!("hello"); + let value2 = c_string!("world"); - list.add_pair( - key2.as_ptr() as *const c_char, - value2.as_ptr() as *const c_char, - ); + list.add_pair( + key2.as_ptr() as *const c_char, + value2.as_ptr() as *const c_char, + ); - let pair1 = list - .find(key1.as_ptr() as *const c_char) - .unwrap() - .get_pair(); + let pair1 = list + .find(key1.as_ptr() as *const c_char) + .unwrap() + .get_pair(); - let pair2 = list - .find(key2.as_ptr() as *const c_char) - .unwrap() - .get_pair(); + let pair2 = list + .find(key2.as_ptr() as *const c_char) + .unwrap() + .get_pair(); - assert_eq!(pair1.key().as_str(), "foo"); - assert_eq!(pair1.value().as_str(), "bar"); - assert_eq!(pair2.key().as_str(), "hello"); - assert_eq!(pair2.value().as_str(), "world"); + assert_eq!(pair1.key().as_str(), "foo"); + assert_eq!(pair1.value().as_str(), "bar"); + assert_eq!(pair2.key().as_str(), "hello"); + assert_eq!(pair2.value().as_str(), "world"); + } } #[test] @@ -165,25 +167,27 @@ mod tests { let key = c_string!("foo"); let value = c_string!("bar"); - list.add_pair( - key.as_ptr() as *const c_char, - value.as_ptr() as *const c_char, - ); + unsafe { + list.add_pair( + key.as_ptr() as *const c_char, + value.as_ptr() as *const c_char, + ); - let pair = list.find(key.as_ptr() as *const c_char).unwrap().get_pair(); + let pair = list.find(key.as_ptr() as *const c_char).unwrap().get_pair(); - assert_eq!(pair.value().as_str(), "bar"); + assert_eq!(pair.value().as_str(), "bar"); - let value = c_string!("baz"); + let value = c_string!("baz"); - list.add_pair( - key.as_ptr() as *const c_char, - value.as_ptr() as *const c_char, - ); + list.add_pair( + key.as_ptr() as *const c_char, + value.as_ptr() as *const c_char, + ); - let pair = list.find(key.as_ptr() as *const c_char).unwrap().get_pair(); + let pair = list.find(key.as_ptr() as *const c_char).unwrap().get_pair(); - assert_eq!(pair.value().as_str(), "baz"); + assert_eq!(pair.value().as_str(), "baz"); + } } #[test] @@ -194,12 +198,14 @@ mod tests { let key = c_string!("foo"); let value = c_string!("bar"); - list.add_pair( - key.as_ptr() as *const c_char, - value.as_ptr() as *const c_char, - ); + unsafe { + list.add_pair( + key.as_ptr() as *const c_char, + value.as_ptr() as *const c_char, + ); - assert_eq!(list.length(), 1); + assert_eq!(list.length(), 1); + } } #[test] @@ -210,12 +216,14 @@ mod tests { let key = c_string!("foo"); let value = c_string!("bar"); - list.add_pair( - key.as_ptr() as *const c_char, - value.as_ptr() as *const c_char, - ); + unsafe { + list.add_pair( + key.as_ptr() as *const c_char, + value.as_ptr() as *const c_char, + ); - assert_eq!(list.to_string().as_str(), "\"foo=bar\""); + assert_eq!(list.to_string().as_str(), "\"foo=bar\""); + } } #[test] @@ -226,11 +234,13 @@ mod tests { let key = c_string!("foo"); let value = c_string!("bar"); - list.add_pair( - key.as_ptr() as *const c_char, - value.as_ptr() as *const c_char, - ); + unsafe { + list.add_pair( + key.as_ptr() as *const c_char, + value.as_ptr() as *const c_char, + ); - assert_eq!(list.clone(), list); + assert_eq!(list.clone(), list); + } } } diff --git a/zeroconf/src/macros.rs b/zeroconf/src/macros.rs index 8f0167c..67bbfc3 100644 --- a/zeroconf/src/macros.rs +++ b/zeroconf/src/macros.rs @@ -21,7 +21,26 @@ macro_rules! bonjour { if err != 0 { crate::Result::Err(format!("{}", format!("{} (code: {})", $msg, err)).into()) } else { - Ok(()) + crate::Result::Ok(()) + } + }}; +} + +#[cfg(target_os = "linux")] +macro_rules! avahi { + ($call:expr, $msg:expr) => {{ + #[allow(unused_unsafe)] + let err = unsafe { $call }; + if err < 0 { + crate::Result::Err( + format!( + "{}", + format!("{}: `{}`", $msg, crate::linux::avahi_util::get_error(err)) + ) + .into(), + ) + } else { + crate::Result::Ok(()) } }}; }