diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-21 09:43:36 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-22 12:28:25 +0000 |
| commit | 1d7e4f31bfe24201886a8497cef2b39e4f984e78 (patch) | |
| tree | 7ac41e987de3c258ae5b8ce22fb2f73c56b0e162 | |
| parent | d2699931a9d1b10d830968a1c9862bd0769666da (diff) | |
| download | mullvadvpn-1d7e4f31bfe24201886a8497cef2b39e4f984e78.tar.xz mullvadvpn-1d7e4f31bfe24201886a8497cef2b39e4f984e78.zip | |
Spawn daemon in a separate thread on Android
| -rw-r--r-- | Cargo.lock | 7 | ||||
| -rw-r--r-- | mullvad-jni/Cargo.toml | 7 | ||||
| -rw-r--r-- | mullvad-jni/src/lib.rs | 81 |
3 files changed, 95 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock index 7f7ac95b04..72473ae7da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1156,7 +1156,14 @@ dependencies = [ name = "mullvad-jni" version = "0.1.0" dependencies = [ + "err-derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "jni 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log-panics 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "mullvad-daemon 2019.4.0", + "mullvad-paths 0.1.0", + "mullvad-types 0.1.0", + "talpid-types 0.1.0", ] [[package]] diff --git a/mullvad-jni/Cargo.toml b/mullvad-jni/Cargo.toml index e3c8c33b08..8671034c4f 100644 --- a/mullvad-jni/Cargo.toml +++ b/mullvad-jni/Cargo.toml @@ -10,4 +10,11 @@ edition = "2018" crate_type = ["cdylib"] [dependencies] +err-derive = "0.1.5" +log = "0.4" +log-panics = "2" jni = "0.11" +mullvad-daemon = { path = "../mullvad-daemon" } +mullvad-paths = { path = "../mullvad-paths" } +mullvad-types = { path = "../mullvad-types" } +talpid-types = { path = "../talpid-types" } diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs index 83eb8ce895..e5420a53ee 100644 --- a/mullvad-jni/src/lib.rs +++ b/mullvad-jni/src/lib.rs @@ -1,6 +1,87 @@ +#![cfg(target_os = "android")] + use jni::{objects::JObject, JNIEnv}; +use mullvad_daemon::{logging, version, Daemon, EventListener}; +use mullvad_types::{relay_list::RelayList, settings::Settings}; +use std::{path::PathBuf, sync::mpsc, thread}; +use talpid_types::{tunnel::TunnelStateTransition, ErrorExt}; + +const LOG_FILENAME: &str = "daemon.log"; + +#[derive(Debug, err_derive::Error)] +pub enum Error { + #[error(display = "Failed to get cache directory path")] + GetCacheDir(#[error(cause)] mullvad_paths::Error), + + #[error(display = "Failed to initialize the mullvad daemon")] + InitializeDaemon(#[error(cause)] mullvad_daemon::Error), +} #[no_mangle] #[allow(non_snake_case)] pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_initialize(_: JNIEnv, _: JObject) { + let log_dir = start_logging(); + + if let Err(error) = initialize(log_dir) { + log::error!("{}", error.display_chain()); + } +} + +fn start_logging() -> PathBuf { + let log_dir = mullvad_paths::log_dir().unwrap(); + let log_file = log_dir.join(LOG_FILENAME); + + logging::init_logger(log::LevelFilter::Debug, Some(&log_file), true).unwrap(); + log_panics::init(); + version::log_version(); + + log_dir +} + +fn initialize(log_dir: PathBuf) -> Result<(), Error> { + spawn_daemon(log_dir) +} + +fn spawn_daemon(log_dir: PathBuf) -> Result<(), Error> { + let (tx, rx) = mpsc::channel(); + + thread::spawn(move || match create_daemon(log_dir) { + Ok(daemon) => { + let _ = tx.send(Ok(())); + match daemon.run() { + Ok(()) => log::info!("Mullvad daemon has stopped"), + Err(error) => log::error!("{}", error.display_chain()), + } + } + Err(error) => { + let _ = tx.send(Err(error)); + } + }); + + rx.recv().unwrap() +} + +fn create_daemon(log_dir: PathBuf) -> Result<Daemon<DummyListener>, Error> { + let resource_dir = mullvad_paths::get_resource_dir(); + let cache_dir = mullvad_paths::cache_dir().map_err(Error::GetCacheDir)?; + + let daemon = Daemon::start_with_event_listener( + DummyListener, + Some(log_dir), + resource_dir, + cache_dir, + version::PRODUCT_VERSION.to_owned(), + ) + .map_err(Error::InitializeDaemon)?; + + Ok(daemon) +} + +#[derive(Clone, Copy, Debug)] +struct DummyListener; + +impl EventListener for DummyListener { + fn notify_new_state(&self, _: TunnelStateTransition) {} + fn notify_settings(&self, _: Settings) {} + fn notify_relay_list(&self, _: RelayList) {} } |
