summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2017-07-18 14:23:35 +0200
committerLinus Färnstrand <linus@mullvad.net>2017-07-18 15:00:49 +0200
commit535f9097ba24fd2060bf724dc7854b729d5c4d6d (patch)
tree02fa2ab55f07faa2fa1482387a0da7e5a7506361
parentd165d9abd8f9ee13992f02ed9d25e237ea1be2ac (diff)
downloadmullvadvpn-535f9097ba24fd2060bf724dc7854b729d5c4d6d.tar.xz
mullvadvpn-535f9097ba24fd2060bf724dc7854b729d5c4d6d.zip
Make set_account call return error on save failure
-rw-r--r--mullvad-daemon/src/main.rs15
-rw-r--r--mullvad-daemon/src/management_interface.rs18
2 files changed, 16 insertions, 17 deletions
diff --git a/mullvad-daemon/src/main.rs b/mullvad-daemon/src/main.rs
index 680e5dbb90..3710adc087 100644
--- a/mullvad-daemon/src/main.rs
+++ b/mullvad-daemon/src/main.rs
@@ -271,9 +271,14 @@ impl Daemon {
warn!("Unable to send current state to management interface client",);
}
}
- SetAccount(account_token) => {
+ SetAccount(tx, account_token) => {
let save_result = self.settings.set_account_token(account_token);
- self.handle_settings_save(save_result);
+ match save_result.chain_err(|| "Unable to save settings") {
+ Ok(()) => if let Err(_) = tx.send(()) {
+ warn!("Unable to send response to management interface client");
+ },
+ Err(e) => error!("{}", e.display()),
+ }
}
GetAccount(tx) => {
if let Err(_) = tx.send(self.settings.get_account_token()) {
@@ -297,12 +302,6 @@ impl Daemon {
self.set_target_state(TargetState::Unsecured)
}
- fn handle_settings_save(&self, save_result: settings::Result<()>) {
- if let Err(e) = save_result.chain_err(|| "Unable to save settings") {
- error!("{}", e.display());
- }
- }
-
/// Update the state of the client. If it changed, notify the subscribers and trigger
/// appropriate actions.
fn set_state(&mut self, new_state: TunnelState) -> Result<()> {
diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs
index ffba3dca0f..f78f991c0e 100644
--- a/mullvad-daemon/src/management_interface.rs
+++ b/mullvad-daemon/src/management_interface.rs
@@ -49,8 +49,8 @@ build_rpc_trait! {
fn get_countries(&self) -> Result<HashMap<CountryCode, String>, Error>;
/// Set which account to connect with.
- #[rpc(name = "set_account")]
- fn set_account(&self, Option<AccountToken>) -> Result<(), Error>;
+ #[rpc(async, name = "set_account")]
+ fn set_account(&self, Option<AccountToken>) -> BoxFuture<(), Error>;
/// Get which account is configured.
#[rpc(async, name = "get_account")]
@@ -118,7 +118,7 @@ pub enum TunnelCommand {
/// Request the current state.
GetState(sync::oneshot::Sender<DaemonState>),
/// Set which account token to use for subsequent connection attempts.
- SetAccount(Option<AccountToken>),
+ SetAccount(sync::oneshot::Sender<()>, Option<AccountToken>),
/// Request the current account token being used.
GetAccount(sync::oneshot::Sender<Option<AccountToken>>),
}
@@ -260,13 +260,13 @@ impl<T: From<TunnelCommand> + 'static + Send> ManagementInterfaceApi for Managem
Ok(HashMap::new())
}
- fn set_account(&self, account_token: Option<AccountToken>) -> Result<(), Error> {
+ fn set_account(&self, account_token: Option<AccountToken>) -> BoxFuture<(), Error> {
trace!("set_account");
- self.tx
- .lock()
- .unwrap()
- .send(TunnelCommand::SetAccount(account_token))
- .map_err(|_| Error::internal_error())
+ let (tx, rx) = sync::oneshot::channel();
+ match self.tx.lock().unwrap().send(TunnelCommand::SetAccount(tx, account_token)) {
+ Ok(()) => rx.map_err(|_| Error::internal_error()).boxed(),
+ Err(_) => future::err(Error::internal_error()).boxed(),
+ }
}
fn get_account(&self) -> BoxFuture<Option<AccountToken>, Error> {