snowstorm/client/provider/
unix.rs1use tokio_util::compat::{Compat, FuturesAsyncReadCompatExt};
2use tunio::{
3 traits::{DriverT, InterfaceT},
4 DefaultAsyncInterface, DefaultDriver,
5};
6
7use crate::client::{ClientError, Result, TunnelProvider};
8
9pub struct TunioTunnelProvider {
10 fd: i32,
11}
12
13impl TunioTunnelProvider {
14 pub fn new(fd: i32) -> Self {
15 Self { fd }
16 }
17}
18
19impl TunnelProvider for TunioTunnelProvider {
20 type Device = Compat<DefaultAsyncInterface>;
21 type State = ();
22
23 fn get_device(&self) -> Result<Self::Device> {
24 let mut tun_driver = DefaultDriver::new().map_err(|_| ClientError::TunnelProviderError)?;
25
26 let tun_config = DefaultAsyncInterface::config_builder()
27 .name("utun321".to_string()) .platform(|mut b| b.raw_fd(Some(self.fd)).build())
29 .unwrap()
30 .build()
31 .unwrap();
32
33 let device = DefaultAsyncInterface::new_up(&mut tun_driver, tun_config)
34 .map_err(|_| ClientError::TunnelProviderError)?
35 .compat();
36
37 Ok(device)
38 }
39
40 fn state(&self) -> Self::State {
41 ()
42 }
43}