use std::io::Read;
use std::sync::mpsc::Receiver;
use tun::BoxError;
fn main() -> Result<(), BoxError> {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("trace")).init();
let (tx, rx) = std::sync::mpsc::channel();
let handle = ctrlc2::set_handler(move || {
tx.send(()).expect("Signal error.");
true
})
.expect("Error setting Ctrl-C handler");
main_entry(rx)?;
handle.join().unwrap();
Ok(())
}
fn main_entry(quit: Receiver<()>) -> Result<(), BoxError> {
let mut config = tun::Configuration::default();
config
.address((10, 0, 0, 9))
.netmask((255, 255, 255, 0))
.destination((10, 0, 0, 1))
.up();
#[cfg(target_os = "linux")]
config.platform_config(|config| {
config.ensure_root_privileges(true);
});
let mut dev = tun::create(&config)?;
std::thread::spawn(move || {
let mut buf = [0; 4096];
loop {
let amount = dev.read(&mut buf)?;
println!("{:?}", &buf[0..amount]);
}
#[allow(unreachable_code)]
Ok::<(), BoxError>(())
});
quit.recv().expect("Quit error.");
Ok(())
}