diff options
| -rw-r--r-- | talpid-core/src/lib.rs | 5 | ||||
| -rw-r--r-- | talpid-core/src/security/windows/dns.rs | 16 | ||||
| -rw-r--r-- | talpid-core/src/security/windows/ffi.rs | 13 | ||||
| -rw-r--r-- | talpid-core/src/security/windows/mod.rs | 34 | ||||
| -rw-r--r-- | talpid-core/src/winnet.rs (renamed from talpid-core/src/security/windows/route.rs) | 25 |
5 files changed, 49 insertions, 44 deletions
diff --git a/talpid-core/src/lib.rs b/talpid-core/src/lib.rs index ecc530aec3..54e3ef08ef 100644 --- a/talpid-core/src/lib.rs +++ b/talpid-core/src/lib.rs @@ -35,6 +35,8 @@ extern crate uuid; #[cfg(target_os = "linux")] extern crate which; #[cfg(windows)] +extern crate widestring; +#[cfg(windows)] extern crate winreg; extern crate openvpn_plugin; @@ -45,6 +47,9 @@ extern crate talpid_types; #[macro_use] extern crate nftnl; +#[cfg(windows)] +mod winnet; + /// Working with processes. pub mod process; diff --git a/talpid-core/src/security/windows/dns.rs b/talpid-core/src/security/windows/dns.rs index d068cb4151..4904946c98 100644 --- a/talpid-core/src/security/windows/dns.rs +++ b/talpid-core/src/security/windows/dns.rs @@ -1,16 +1,14 @@ -extern crate widestring; - -use super::ffi; -use super::system_state::SystemStateWriter; - -use self::widestring::WideCString; -use libc; use std::net::IpAddr; use std::path::Path; use std::ptr; use std::slice; use error_chain::ChainedError; +use libc; +use widestring::WideCString; + +use super::system_state::SystemStateWriter; +use winnet; const DNS_STATE_FILENAME: &'static str = "dns-state-backup"; @@ -49,7 +47,7 @@ pub struct WinDns { impl WinDns { pub fn new<P: AsRef<Path>>(cache_dir: P) -> Result<Self> { - unsafe { WinDns_Initialize(Some(ffi::error_sink), ptr::null_mut()).into_result()? }; + unsafe { WinDns_Initialize(Some(winnet::error_sink), ptr::null_mut()).into_result()? }; let backup_writer = SystemStateWriter::new( cache_dir @@ -191,7 +189,7 @@ extern "system" { #[link_name(WinDns_Initialize)] pub fn WinDns_Initialize( - sink: Option<ffi::ErrorSink>, + sink: Option<winnet::ErrorSink>, sink_context: *mut libc::c_void, ) -> InitializationResult; diff --git a/talpid-core/src/security/windows/ffi.rs b/talpid-core/src/security/windows/ffi.rs index 029989359e..2362876897 100644 --- a/talpid-core/src/security/windows/ffi.rs +++ b/talpid-core/src/security/windows/ffi.rs @@ -1,16 +1,3 @@ -use libc::{c_char, c_void}; - -pub type ErrorSink = extern "system" fn(msg: *const c_char, ctx: *mut c_void); - -pub extern "system" fn error_sink(msg: *const c_char, _ctx: *mut c_void) { - use std::ffi::CStr; - if msg.is_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) => { diff --git a/talpid-core/src/security/windows/mod.rs b/talpid-core/src/security/windows/mod.rs index e762a4887a..6ecca8988b 100644 --- a/talpid-core/src/security/windows/mod.rs +++ b/talpid-core/src/security/windows/mod.rs @@ -1,24 +1,21 @@ -extern crate widestring; - -use super::{NetworkSecurityT, SecurityPolicy}; use std::net::IpAddr; use std::path::Path; use std::ptr; -use self::winfw::*; use talpid_types::net::Endpoint; +use widestring::WideCString; -use self::widestring::WideCString; - +use self::dns::WinDns; +use self::winfw::*; +use super::{NetworkSecurityT, SecurityPolicy}; +use winnet; #[macro_use] mod ffi; + mod dns; -mod route; mod system_state; -use self::dns::WinDns; - error_chain! { errors { /// Failure to initialize windows firewall module @@ -50,11 +47,15 @@ error_chain! { ResettingPolicy { description("Failed to reset firewall policies") } + + /// Failure to set TAP adapter metric + SetTapMetric { + description("Unable to set TAP adapter metric") + } } links { WinDns(dns::Error, dns::ErrorKind) #[doc = "WinDNS failure"]; - WinRoute(route::Error, route::ErrorKind) #[doc = "Failure to modify system routing metrics"]; } } @@ -73,7 +74,7 @@ impl NetworkSecurityT for NetworkSecurity { unsafe { WinFw_Initialize( WINFW_TIMEOUT_SECONDS, - Some(ffi::error_sink), + Some(winnet::error_sink), ptr::null_mut(), ).into_result()? }; @@ -168,14 +169,15 @@ impl NetworkSecurity { self.dns.set_dns(&vec![tunnel_metadata.gateway.into()])?; - let metrics_set = route::ensure_top_metric_for_interface(&tunnel_metadata.interface)?; + let metrics_set = winnet::ensure_top_metric_for_interface(&tunnel_metadata.interface) + .chain_err(|| ErrorKind::SetTapMetric)?; + if metrics_set { debug!("Network interface metrics were changed"); } else { debug!("Network interface metrics were not changed"); } - unsafe { WinFw_ApplyPolicyConnected( winfw_settings, @@ -195,10 +197,12 @@ impl NetworkSecurity { #[allow(non_snake_case)] mod winfw { - use super::{ffi, ErrorKind, Result}; use libc; use talpid_types::net::TransportProtocol; + use super::{ErrorKind, Result}; + use winnet; + #[repr(C)] pub struct WinFwRelay { pub ip: *const libc::wchar_t, @@ -254,7 +258,7 @@ mod winfw { #[link_name(WinFw_Initialize)] pub fn WinFw_Initialize( timeout: libc::c_uint, - sink: Option<ffi::ErrorSink>, + sink: Option<winnet::ErrorSink>, sink_context: *mut libc::c_void, ) -> InitializationResult; diff --git a/talpid-core/src/security/windows/route.rs b/talpid-core/src/winnet.rs index 6ecf336956..b906b2af3a 100644 --- a/talpid-core/src/security/windows/route.rs +++ b/talpid-core/src/winnet.rs @@ -1,8 +1,8 @@ -use super::ffi; -use super::widestring::WideCString; -use libc; use std::ptr; +use libc::{c_char, c_void, wchar_t}; +use widestring::WideCString; + error_chain!{ errors{ /// Failure to set metrics of network interfaces @@ -15,6 +15,17 @@ error_chain!{ } } +pub type ErrorSink = extern "system" fn(msg: *const c_char, ctx: *mut c_void); + +pub extern "system" fn error_sink(msg: *const c_char, _ctx: *mut c_void) { + use std::ffi::CStr; + if msg.is_null() { + error!("Log message from FFI boundary is NULL"); + } else { + error!("{}", unsafe { CStr::from_ptr(msg).to_string_lossy() }); + } +} + /// Returns true if metrics were changed, false otherwise pub fn ensure_top_metric_for_interface(interface_alias: &str) -> Result<bool> { let interface_alias_ws = @@ -22,7 +33,7 @@ pub fn ensure_top_metric_for_interface(interface_alias: &str) -> Result<bool> { unsafe { WinRoute_EnsureTopMetric( interface_alias_ws.as_wide_c_str().as_ptr(), - Some(ffi::error_sink), + Some(error_sink), ptr::null_mut(), ).into() } @@ -56,8 +67,8 @@ impl Into<Result<bool>> for MetricResult { extern "system" { #[link_name(WinRoute_EnsureTopMetric)] fn WinRoute_EnsureTopMetric( - tunnel_interface_alias: *const libc::wchar_t, - sink: Option<ffi::ErrorSink>, - sink_context: *mut libc::c_void, + tunnel_interface_alias: *const wchar_t, + sink: Option<ErrorSink>, + sink_context: *mut c_void, ) -> MetricResult; } |
