summaryrefslogtreecommitdiffhomepage
path: root/talpid_openvpn_plugin/src/lib.rs
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2017-03-06 19:41:33 +0100
committerLinus Färnstrand <linus@mullvad.net>2017-03-07 08:42:02 +0100
commitae3458fdd2ee092924ce2f275e622f6a66fab903 (patch)
treea6f5a196c0c0b7d3b5b9080ce7d80e9bfb4b2210 /talpid_openvpn_plugin/src/lib.rs
parentf085642d25c2f91095ce01d324a59b5cee23e8b0 (diff)
downloadmullvadvpn-ae3458fdd2ee092924ce2f275e622f6a66fab903.tar.xz
mullvadvpn-ae3458fdd2ee092924ce2f275e622f6a66fab903.zip
Extract OpenVPN FFI stuff to separate crate
Diffstat (limited to 'talpid_openvpn_plugin/src/lib.rs')
-rw-r--r--talpid_openvpn_plugin/src/lib.rs48
1 files changed, 23 insertions, 25 deletions
diff --git a/talpid_openvpn_plugin/src/lib.rs b/talpid_openvpn_plugin/src/lib.rs
index 58343de791..1b6b1fec2b 100644
--- a/talpid_openvpn_plugin/src/lib.rs
+++ b/talpid_openvpn_plugin/src/lib.rs
@@ -5,18 +5,13 @@ extern crate error_chain;
extern crate log;
extern crate env_logger;
-#[cfg(test)]
-#[macro_use]
-extern crate assert_matches;
-
+extern crate openvpn_ffi;
extern crate talpid_ipc;
use std::os::raw::{c_int, c_void};
-mod ffi;
mod processing;
-use ffi::OpenVpnPluginEvent;
use processing::EventProcessor;
@@ -43,8 +38,8 @@ error_chain!{
/// All the OpenVPN events this plugin will register for listening to. Edit this variable to change
/// events.
-pub static INTERESTING_EVENTS: &'static [OpenVpnPluginEvent] = &[OpenVpnPluginEvent::Up,
- OpenVpnPluginEvent::RoutePredown];
+pub static INTERESTING_EVENTS: &'static [openvpn_ffi::OpenVpnPluginEvent] =
+ &[openvpn_ffi::OpenVpnPluginEvent::Up, openvpn_ffi::OpenVpnPluginEvent::RoutePredown];
/// Called by OpenVPN when the plugin is first loaded.
@@ -53,29 +48,29 @@ pub static INTERESTING_EVENTS: &'static [OpenVpnPluginEvent] = &[OpenVpnPluginEv
/// plugin.
#[no_mangle]
pub extern "C" fn openvpn_plugin_open_v3(_version: c_int,
- args: *const ffi::openvpn_plugin_args_open_in,
- retptr: *mut ffi::openvpn_plugin_args_open_return)
+ args: *const openvpn_ffi::openvpn_plugin_args_open_in,
+ retptr: *mut openvpn_ffi::openvpn_plugin_args_open_return)
-> c_int {
if init_logger().is_err() {
- return ffi::OPENVPN_PLUGIN_FUNC_ERROR;
+ return openvpn_ffi::OPENVPN_PLUGIN_FUNC_ERROR;
}
match openvpn_plugin_open_v3_internal(args, retptr) {
- Ok(_) => ffi::OPENVPN_PLUGIN_FUNC_SUCCESS,
+ Ok(_) => openvpn_ffi::OPENVPN_PLUGIN_FUNC_SUCCESS,
Err(e) => {
log_error("Unable to initialize plugin", &e);
- ffi::OPENVPN_PLUGIN_FUNC_ERROR
+ openvpn_ffi::OPENVPN_PLUGIN_FUNC_ERROR
}
}
}
-fn openvpn_plugin_open_v3_internal(args: *const ffi::openvpn_plugin_args_open_in,
- retptr: *mut ffi::openvpn_plugin_args_open_return)
+fn openvpn_plugin_open_v3_internal(args: *const openvpn_ffi::openvpn_plugin_args_open_in,
+ retptr: *mut openvpn_ffi::openvpn_plugin_args_open_return)
-> Result<()> {
debug!("Initializing plugin");
let core_server_id = parse_args(args)?;
let processor = EventProcessor::new(core_server_id).chain_err(|| ErrorKind::InitHandleFailed)?;
unsafe {
- (*retptr).type_mask = ffi::events_to_bitmask(INTERESTING_EVENTS);
+ (*retptr).type_mask = openvpn_ffi::events_to_bitmask(INTERESTING_EVENTS);
// Converting the handle into a raw pointer will make it escape Rust deallocation. See
// `openvpn_plugin_close_v1` for deallocation.
(*retptr).handle = Box::into_raw(Box::new(processor)) as *const c_void;
@@ -83,8 +78,9 @@ fn openvpn_plugin_open_v3_internal(args: *const ffi::openvpn_plugin_args_open_in
Ok(())
}
-fn parse_args(args: *const ffi::openvpn_plugin_args_open_in) -> Result<talpid_ipc::IpcServerId> {
- let mut args_iter = unsafe { ffi::parse::string_array((*args).argv) }
+fn parse_args(args: *const openvpn_ffi::openvpn_plugin_args_open_in)
+ -> Result<talpid_ipc::IpcServerId> {
+ let mut args_iter = unsafe { openvpn_ffi::parse::string_array((*args).argv) }
.chain_err(|| ErrorKind::ParseArgsFailed)?
.into_iter();
let _plugin_path = args_iter.next();
@@ -109,23 +105,25 @@ pub extern "C" fn openvpn_plugin_close_v1(handle: *const c_void) {
/// `openvpn_plugin_open_v3`
#[no_mangle]
pub extern "C" fn openvpn_plugin_func_v3(_version: c_int,
- args: *const ffi::openvpn_plugin_args_func_in,
- _retptr: *const ffi::openvpn_plugin_args_func_return)
+ args: *const openvpn_ffi::openvpn_plugin_args_func_in,
+ _retptr: *const openvpn_ffi::openvpn_plugin_args_func_return)
-> c_int {
match openvpn_plugin_func_v3_internal(args) {
- Ok(_) => ffi::OPENVPN_PLUGIN_FUNC_SUCCESS,
+ Ok(_) => openvpn_ffi::OPENVPN_PLUGIN_FUNC_SUCCESS,
Err(e) => {
log_error("Error while processing event", &e);
- ffi::OPENVPN_PLUGIN_FUNC_ERROR
+ openvpn_ffi::OPENVPN_PLUGIN_FUNC_ERROR
}
}
}
-fn openvpn_plugin_func_v3_internal(args: *const ffi::openvpn_plugin_args_func_in) -> Result<()> {
+fn openvpn_plugin_func_v3_internal(args: *const openvpn_ffi::openvpn_plugin_args_func_in)
+ -> Result<()> {
let event_type = unsafe { (*args).event_type };
- let event = OpenVpnPluginEvent::from_int(event_type).chain_err(|| ErrorKind::InvalidEventType)?;
+ let event = openvpn_ffi::OpenVpnPluginEvent::from_int(event_type).chain_err(|| ErrorKind::InvalidEventType)?;
debug!("Received event: {:?}", event);
- let env = unsafe { ffi::parse::env((*args).envp) }.chain_err(|| ErrorKind::ParseEnvFailed)?;
+ let env =
+ unsafe { openvpn_ffi::parse::env((*args).envp) }.chain_err(|| ErrorKind::ParseEnvFailed)?;
let mut handle = unsafe { Box::from_raw((*args).handle as *mut EventProcessor) };
handle.process_event(event, env).chain_err(|| ErrorKind::EventProcessingFailed)?;