diff options
| author | Emīls <emils@mullvad.net> | 2020-11-17 11:55:53 +0000 |
|---|---|---|
| committer | Emīls <emils@mullvad.net> | 2020-11-19 11:53:23 +0000 |
| commit | 5c478b6f6353ff59852e9d54438f127bb557043f (patch) | |
| tree | abd3fcc414ae05f653954caba18f43e9ea4a1eef | |
| parent | e4ca34beae0a8dea63b32a58ae789a9438ea6349 (diff) | |
| download | mullvadvpn-5c478b6f6353ff59852e9d54438f127bb557043f.tar.xz mullvadvpn-5c478b6f6353ff59852e9d54438f127bb557043f.zip | |
Add shared DBus connection
| -rw-r--r-- | talpid-core/src/dns/linux/systemd_resolved.rs | 8 | ||||
| -rw-r--r-- | talpid-core/src/linux/dbus.rs | 19 | ||||
| -rw-r--r-- | talpid-core/src/linux/mod.rs | 2 | ||||
| -rw-r--r-- | talpid-core/src/linux/network_manager.rs | 2 |
4 files changed, 26 insertions, 5 deletions
diff --git a/talpid-core/src/dns/linux/systemd_resolved.rs b/talpid-core/src/dns/linux/systemd_resolved.rs index 9236d1e577..3345b38a5f 100644 --- a/talpid-core/src/dns/linux/systemd_resolved.rs +++ b/talpid-core/src/dns/linux/systemd_resolved.rs @@ -6,7 +6,7 @@ use dbus::{ }; use lazy_static::lazy_static; use libc::{AF_INET, AF_INET6}; -use std::{fs, io, net::IpAddr, path::Path, time::Duration}; +use std::{fs, io, net::IpAddr, path::Path, sync::Arc, time::Duration}; use talpid_types::ErrorExt as _; pub type Result<T> = std::result::Result<T, Error>; @@ -69,13 +69,13 @@ const SET_DOMAINS_METHOD: &str = "SetDomains"; const REVERT_METHOD: &str = "Revert"; pub struct SystemdResolved { - pub dbus_connection: SyncConnection, + pub dbus_connection: Arc<SyncConnection>, interface_link: Option<(String, dbus::Path<'static>)>, } impl SystemdResolved { pub fn new() -> Result<Self> { - let dbus_connection = SyncConnection::new_system().map_err(Error::ConnectDBus)?; + let dbus_connection = crate::linux::dbus::get_connection().map_err(Error::ConnectDBus)?; let systemd_resolved = SystemdResolved { dbus_connection, @@ -207,7 +207,7 @@ impl SystemdResolved { RESOLVED_BUS, link_object_path, RPC_TIMEOUT, - &self.dbus_connection, + &*self.dbus_connection, ) .method_call(LINK_INTERFACE, SET_DOMAINS_METHOD, (dns_domains,)) .map_err(Error::SetDomainsError) diff --git a/talpid-core/src/linux/dbus.rs b/talpid-core/src/linux/dbus.rs new file mode 100644 index 0000000000..147574895d --- /dev/null +++ b/talpid-core/src/linux/dbus.rs @@ -0,0 +1,19 @@ +//! DBus system connection +use dbus::blocking::SyncConnection; +use std::sync::{Arc, Mutex}; +lazy_static::lazy_static! { + static ref DBUS_CONNECTION: Mutex<Option<Arc<SyncConnection>>> = Mutex::new(None); +} + +/// Reuse or create a system DBus connection. +pub fn get_connection() -> Result<Arc<SyncConnection>, dbus::Error> { + let mut connection = DBUS_CONNECTION.lock().expect("DBus lock poisoned"); + match &*connection { + Some(existing_connection) => Ok(existing_connection.clone()), + None => { + let new_connection = Arc::new(SyncConnection::new_system()?); + *connection = Some(new_connection.clone()); + Ok(new_connection) + } + } +} diff --git a/talpid-core/src/linux/mod.rs b/talpid-core/src/linux/mod.rs index 2ecf1935de..8bc3836ca2 100644 --- a/talpid-core/src/linux/mod.rs +++ b/talpid-core/src/linux/mod.rs @@ -4,6 +4,8 @@ use std::{ }; pub mod network_manager; +pub mod dbus; + /// Converts an interface name into the corresponding index. pub fn iface_index(name: &str) -> Result<libc::c_uint, IfaceIndexLookupError> { let c_name = CString::new(name) diff --git a/talpid-core/src/linux/network_manager.rs b/talpid-core/src/linux/network_manager.rs index 373104a0ea..8ce4f3db71 100644 --- a/talpid-core/src/linux/network_manager.rs +++ b/talpid-core/src/linux/network_manager.rs @@ -107,7 +107,7 @@ pub struct NetworkManager { impl NetworkManager { pub fn new() -> Result<Self> { Ok(Self { - connection: Arc::new(SyncConnection::new_system()?), + connection: crate::linux::dbus::get_connection()?, }) } |
