summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls <emils@mullvad.net>2020-11-17 11:55:53 +0000
committerEmīls <emils@mullvad.net>2020-11-19 11:53:23 +0000
commit5c478b6f6353ff59852e9d54438f127bb557043f (patch)
treeabd3fcc414ae05f653954caba18f43e9ea4a1eef
parente4ca34beae0a8dea63b32a58ae789a9438ea6349 (diff)
downloadmullvadvpn-5c478b6f6353ff59852e9d54438f127bb557043f.tar.xz
mullvadvpn-5c478b6f6353ff59852e9d54438f127bb557043f.zip
Add shared DBus connection
-rw-r--r--talpid-core/src/dns/linux/systemd_resolved.rs8
-rw-r--r--talpid-core/src/linux/dbus.rs19
-rw-r--r--talpid-core/src/linux/mod.rs2
-rw-r--r--talpid-core/src/linux/network_manager.rs2
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()?,
})
}