aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interface/config.rs13
-rw-r--r--src/interface/mod.rs9
2 files changed, 18 insertions, 4 deletions
diff --git a/src/interface/config.rs b/src/interface/config.rs
index 41762ea..5597bd8 100644
--- a/src/interface/config.rs
+++ b/src/interface/config.rs
@@ -4,8 +4,11 @@
// * Configuration service should use channels to report updates it receives over its interface.
use std::net::SocketAddr;
+use std::env;
+use std::io::Write;
use std::{cell::RefCell, iter::Iterator, rc::Rc, mem, str};
-use std::fs::{create_dir, remove_file};
+use std::fs::{File, Permissions, create_dir, remove_file};
+use std::os::unix::fs::PermissionsExt;
use std::path::{Path, PathBuf};
use base64;
@@ -146,6 +149,14 @@ pub struct ConfigurationService {
impl ConfigurationService {
pub fn new(interface_name: &str, state: &SharedState, peer_server_tx: mpsc::UnboundedSender<ChannelMessage>, handle: &Handle) -> Result<Self, Error> {
+ if let Ok(name) = env::var("WG_TUN_NAME_FILE") {
+ debug!("writing interface name {} to {}", interface_name, name);
+ let mut f = File::create(name)?;
+ f.set_permissions(Permissions::from_mode(0400))?;
+ f.write_all(interface_name.as_bytes())?;
+ f.write_all(b"\n")?;
+ }
+
let config_path = Self::get_path(interface_name).unwrap();
let listener = UnixListener::bind(config_path.clone(), handle).unwrap();
diff --git a/src/interface/mod.rs b/src/interface/mod.rs
index d40061a..c45e70f 100644
--- a/src/interface/mod.rs
+++ b/src/interface/mod.rs
@@ -98,9 +98,12 @@ impl Interface {
let (utun_tx, utun_rx) = unsync::mpsc::unbounded::<Vec<u8>>();
- let peer_server = PeerServer::new(core.handle(), self.state.clone(), utun_tx.clone())?;
- let config_server = ConfigurationService::new(&self.name, &self.state, peer_server.tx(), &core.handle())?.map_err(|_|());
- let utun_stream = UtunStream::connect(&self.name, &core.handle())?.framed(VecUtunCodec{});
+ let peer_server = PeerServer::new(core.handle(), self.state.clone(), utun_tx.clone())?;
+ let utun_stream = UtunStream::connect(&self.name, &core.handle())?;
+ let interface_name = utun_stream.name()?;
+ let utun_stream = utun_stream.framed(VecUtunCodec{});
+ let config_server = ConfigurationService::new(&interface_name, &self.state, peer_server.tx(), &core.handle())?.map_err(|_|());
+ self.name = interface_name;
let (utun_writer, utun_reader) = utun_stream.split();