diff options
| -rw-r--r-- | talpid-core/src/security/linux/dns/systemd_resolved.rs | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/talpid-core/src/security/linux/dns/systemd_resolved.rs b/talpid-core/src/security/linux/dns/systemd_resolved.rs index f4c00012b5..b9123cf8eb 100644 --- a/talpid-core/src/security/linux/dns/systemd_resolved.rs +++ b/talpid-core/src/security/linux/dns/systemd_resolved.rs @@ -11,7 +11,7 @@ use std::{ use self::dbus::arg::RefArg; use self::dbus::stdintf::*; -use self::dbus::{BusType, Interface, Member, MessageItem, MessageItemArray, Signature}; +use self::dbus::{BusType, Interface, Member, Message, MessageItem, MessageItemArray, Signature}; use super::super::iface_index; use super::{resolv_conf, RESOLV_CONF_PATH}; @@ -34,6 +34,9 @@ error_chain! { SetDnsError { description("Failed to configure DNS servers") } + SetDomainsError { + description("Failed to configure DNS domains") + } RevertDnsError { description("Failed to revert DNS configuration") } @@ -41,7 +44,6 @@ error_chain! { description("Failed to initialize a connection to dbus") } } - } const DYNAMIC_RESOLV_CONF_PATH: &str = "/run/systemd/resolve/resolv.conf"; @@ -57,6 +59,7 @@ lazy_static! { Interface::from_slice(b"org.freedesktop.resolve1.Manager").unwrap(); static ref GET_LINK_METHOD: Member<'static> = Member::from_slice(b"GetLink").unwrap(); static ref SET_DNS_METHOD: Member<'static> = Member::from_slice(b"SetDNS").unwrap(); + static ref SET_DOMAINS_METHOD: Member<'static> = Member::from_slice(b"SetDomains").unwrap(); static ref REVERT_METHOD: Member<'static> = Member::from_slice(b"Revert").unwrap(); } @@ -179,7 +182,29 @@ impl SystemdResolved { reply .as_result() .map(|_| ()) - .chain_err(|| ErrorKind::SetDnsError) + .chain_err(|| ErrorKind::SetDnsError)?; + + // set the search domain to catch all DNS requests, forces the link to be the prefered + // resolver, otherwise systemd-resolved will use other interfaces to do DNS lookups + let dns_domains: &[_] = &[(&".", true)]; + + let msg = Message::new_method_call( + RESOLVED_BUS, + link_object_path as &str, + &LINK_INTERFACE as &str, + &SET_DOMAINS_METHOD as &str, + ) + .expect("failed to construct a new dbus message") + .append1(dns_domains); + + let mut reply = self + .dbus_connection + .send_with_reply_and_block(msg, RPC_TIMEOUT_MS) + .chain_err(|| ErrorKind::SetDomainsError)?; + reply + .as_result() + .map(|_| ()) + .chain_err(|| ErrorKind::SetDomainsError) } pub fn reset(&mut self) -> Result<()> { |
