diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-04-11 14:22:12 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-17 17:54:20 +0000 |
| commit | 19f7f41079507428dde6684abdd30bc10e795046 (patch) | |
| tree | 6bf20131e11f45640787bc6178ac9754e386cc1c | |
| parent | 586a0c1f78adad9ef19ec4a676239269627024b1 (diff) | |
| download | mullvadvpn-19f7f41079507428dde6684abdd30bc10e795046.tar.xz mullvadvpn-19f7f41079507428dde6684abdd30bc10e795046.zip | |
Stop management interface when exiting
Will automatically remove the RPC socket file when closing.
| -rw-r--r-- | mullvad-daemon/src/lib.rs | 34 | ||||
| -rw-r--r-- | mullvad-daemon/src/management_interface.rs | 7 |
2 files changed, 14 insertions, 27 deletions
diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs index 37d6e7f6d5..de2da57543 100644 --- a/mullvad-daemon/src/lib.rs +++ b/mullvad-daemon/src/lib.rs @@ -187,8 +187,6 @@ pub struct Daemon { tx: mpsc::Sender<InternalDaemonEvent>, reconnection_loop_tx: Option<mpsc::Sender<()>>, management_interface_broadcaster: management_interface::EventBroadcaster, - #[cfg(unix)] - management_interface_socket_path: String, settings: Settings, account_history: account_history::AccountHistory, wg_key_proxy: WireguardKeyProxy<HttpHandle>, @@ -229,12 +227,12 @@ impl Daemon { let (internal_event_tx, internal_event_rx) = mpsc::channel(); - let management_interface_result = + let management_interface_broadcaster = Self::start_management_interface(internal_event_tx.clone())?; + let relay_list_broadcaster = management_interface_broadcaster.clone(); - let management_interface_broadcaster = management_interface_result.0.clone(); let on_relay_list_update = move |relay_list: &RelayList| { - management_interface_broadcaster.notify_relay_list(relay_list.clone()); + relay_list_broadcaster.notify_relay_list(relay_list.clone()); }; let relay_selector = relays::RelaySelector::new( rpc_handle.clone(), @@ -271,9 +269,7 @@ impl Daemon { rx: internal_event_rx, tx: internal_event_tx, reconnection_loop_tx: None, - management_interface_broadcaster: management_interface_result.0, - #[cfg(unix)] - management_interface_socket_path: management_interface_result.1, + management_interface_broadcaster, settings, account_history, wg_key_proxy: WireguardKeyProxy::new(rpc_handle.clone()), @@ -291,13 +287,12 @@ impl Daemon { // Returns a handle that allows notifying all subscribers on events. fn start_management_interface( event_tx: mpsc::Sender<InternalDaemonEvent>, - ) -> Result<(management_interface::EventBroadcaster, String)> { + ) -> Result<management_interface::EventBroadcaster> { let multiplex_event_tx = IntoSender::from(event_tx.clone()); let server = Self::start_management_interface_server(multiplex_event_tx)?; let event_broadcaster = server.event_broadcaster(); - let socket_path = server.socket_path().to_owned(); Self::spawn_management_interface_wait_thread(server, event_tx); - Ok((event_broadcaster, socket_path)) + Ok(event_broadcaster) } fn start_management_interface_server( @@ -342,6 +337,7 @@ impl Daemon { break; } } + self.management_interface_broadcaster.close(); Ok(()) } @@ -1038,22 +1034,6 @@ impl DaemonShutdownHandle { } } -impl Drop for Daemon { - fn drop(&mut self) { - #[cfg(unix)] - { - use std::fs; - if let Err(e) = fs::remove_file(&self.management_interface_socket_path) { - error!( - "Failed to remove RPC socket {}: {}", - self.management_interface_socket_path, e - ); - } - } - } -} - - struct MullvadTunnelParametersGenerator { tx: mpsc::Sender<InternalDaemonEvent>, } diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs index cb313ed653..c2ebf4ceb2 100644 --- a/mullvad-daemon/src/management_interface.rs +++ b/mullvad-daemon/src/management_interface.rs @@ -260,6 +260,7 @@ impl ManagementInterfaceServer { pub fn event_broadcaster(&self) -> EventBroadcaster { EventBroadcaster { subscriptions: self.subscriptions.clone(), + close_handle: self.server.close_handle(), } } @@ -274,9 +275,15 @@ impl ManagementInterfaceServer { #[derive(Clone)] pub struct EventBroadcaster { subscriptions: Arc<RwLock<HashMap<SubscriptionId, pubsub::Sink<DaemonEvent>>>>, + close_handle: talpid_ipc::CloseHandle, } impl EventBroadcaster { + /// Notifies that the management interface should be closed + pub fn close(self) { + self.close_handle.close(); + } + /// Sends a new state update to all `new_state` subscribers of the management interface. pub fn notify_new_state(&self, new_state: TunnelStateTransition) { log::debug!("Broadcasting new state: {:?}", new_state); |
