summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--talpid-core/src/firewall/windows/ffi.rs45
-rw-r--r--talpid-core/src/firewall/windows/mod.rs3
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"]