diff options
| -rw-r--r-- | talpid-core/src/firewall/windows/ffi.rs | 45 | ||||
| -rw-r--r-- | talpid-core/src/firewall/windows/mod.rs | 3 |
2 files changed, 48 insertions, 0 deletions
diff --git a/talpid-core/src/firewall/windows/ffi.rs b/talpid-core/src/firewall/windows/ffi.rs new file mode 100644 index 0000000000..2cd6c34836 --- /dev/null +++ b/talpid-core/src/firewall/windows/ffi.rs @@ -0,0 +1,45 @@ +extern crate libc; + +use std::os::raw::c_char; +use std::ptr; + +pub type ErrorSink = extern "system" fn(msg: *const c_char, ctx: *mut libc::c_void); + +pub extern "system" fn error_sink(msg: *const c_char, _ctx: *mut libc::c_void) { + use std::ffi::CStr; + if msg == ptr::null() { + error!("Log message from FFI boundary is NULL"); + } else { + error!("{}", unsafe { CStr::from_ptr(msg).to_string_lossy() }); + } +} + +#[macro_export] +macro_rules! ffi_error { + ($result:ident, $error:expr) => { + pub mod $result { + use super::*; + + #[repr(C)] + #[derive(Debug)] + pub struct FFIResult { + success: bool, + } + + impl FFIResult { + pub fn into_result(self) -> Result<()> { + match self.success { + true => Ok(()), + false => Err($error), + } + } + } + + impl Into<Result<()>> for FFIResult { + fn into(self) -> Result<()> { + self.into_result() + } + } + } + }; +} diff --git a/talpid-core/src/firewall/windows/mod.rs b/talpid-core/src/firewall/windows/mod.rs index f85dc090ca..544843b2f7 100644 --- a/talpid-core/src/firewall/windows/mod.rs +++ b/talpid-core/src/firewall/windows/mod.rs @@ -9,6 +9,9 @@ use talpid_types::net::Endpoint; use self::widestring::WideCString; +#[macro_use] +mod ffi; + error_chain!{ errors{ #[doc = "Windows firewall module error"] |
