snowstorm/client/provider/
unix.rs

1use 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()) // OSX naming convention.
28            .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}