aboutsummaryrefslogtreecommitdiffstats
path: root/src/interface/mod.rs
diff options
context:
space:
mode:
authorJake McGinty <me@jake.su>2018-02-26 03:03:15 +0000
committerJake McGinty <me@jake.su>2018-02-26 03:03:15 +0000
commita67009a677900c12f1ba564715c7c55f288259e3 (patch)
tree104400cea175565426b6ec4dbeda732c3fad90db /src/interface/mod.rs
parentadd cross-platform fs notify library (diff)
downloadwireguard-rs-a67009a677900c12f1ba564715c7c55f288259e3.tar.xz
wireguard-rs-a67009a677900c12f1ba564715c7c55f288259e3.zip
die on SIG{INT,TERM} and config UDS deletion, per spec
Diffstat (limited to 'src/interface/mod.rs')
-rw-r--r--src/interface/mod.rs28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/interface/mod.rs b/src/interface/mod.rs
index 532fb40..e969954 100644
--- a/src/interface/mod.rs
+++ b/src/interface/mod.rs
@@ -1,7 +1,9 @@
mod config;
+mod grim_reaper;
mod peer_server;
use self::config::{ConfigurationServiceManager, UpdateEvent, Command, ConfigurationCodec};
+use self::grim_reaper::GrimReaper;
use self::peer_server::PeerServer;
use router::Router;
@@ -13,6 +15,7 @@ use std::io;
use std::rc::Rc;
use std::cell::RefCell;
use std::collections::HashMap;
+use std::fs::remove_file;
use types::{InterfaceInfo};
use x25519_dalek as x25519;
@@ -115,11 +118,14 @@ impl Interface {
.map_err(|e| { warn!("utun write error: {:?}", e); () });
let utun_fut = utun_write_fut.join(utun_read_fut);
- let config_manager = ConfigurationServiceManager::new(&self.name);
- let handle = core.handle();
- let listener = UnixListener::bind(config_manager.get_path().unwrap(), &handle).unwrap();
+ let config_manager = ConfigurationServiceManager::new(&self.name);
+ let handle = core.handle();
+ let config_path = config_manager.get_path().unwrap();
+ let listener = UnixListener::bind(config_path.clone(), &handle).unwrap();
+ let reaper = GrimReaper::spawn(&handle, config_path.parent().unwrap()).unwrap();
let (config_tx, config_rx) = sync::mpsc::channel::<UpdateEvent>(1024);
- let h = handle.clone();
+ let h = handle.clone();
+
let config_server = listener.incoming().for_each({
let config_tx = config_tx.clone();
let state = self.state.clone();
@@ -231,6 +237,18 @@ impl Interface {
let config_fut = peer_server.config_tx().sink_map_err(|_|()).send_all(config_fut).map_err(|e| { warn!("error {:?}", e); () });
- core.run(peer_server.join(utun_fut.join(config_fut.join(config_server)))).unwrap();
+ core.run(reaper.join(peer_server.join(utun_fut.join(config_fut.join(config_server))))).unwrap();
}
}
+
+impl Drop for Interface {
+ fn drop(&mut self) {
+ let mut socket_path = ConfigurationServiceManager::get_run_path().join("wireguard");
+ socket_path.push(&self.name);
+ socket_path.set_extension("sock");
+ if socket_path.exists() {
+ info!("Removing socket on drop: {}", socket_path.display());
+ let _ = remove_file(&socket_path);
+ }
+ }
+} \ No newline at end of file