summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-21 09:43:36 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-22 12:28:25 +0000
commit1d7e4f31bfe24201886a8497cef2b39e4f984e78 (patch)
tree7ac41e987de3c258ae5b8ce22fb2f73c56b0e162
parentd2699931a9d1b10d830968a1c9862bd0769666da (diff)
downloadmullvadvpn-1d7e4f31bfe24201886a8497cef2b39e4f984e78.tar.xz
mullvadvpn-1d7e4f31bfe24201886a8497cef2b39e4f984e78.zip
Spawn daemon in a separate thread on Android
-rw-r--r--Cargo.lock7
-rw-r--r--mullvad-jni/Cargo.toml7
-rw-r--r--mullvad-jni/src/lib.rs81
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) {}
}