You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.5 KiB
82 lines
2.5 KiB
#![cfg(any(target_os = "ios", target_os = "android", target_os = "macos"))]
|
|
|
|
use crate::Args;
|
|
use std::os::raw::c_int;
|
|
|
|
static TUN_QUIT: std::sync::Mutex<Option<tokio_util::sync::CancellationToken>> = std::sync::Mutex::new(None);
|
|
|
|
/// Dummy function to make the build pass.
|
|
#[doc(hidden)]
|
|
#[cfg(not(target_os = "macos"))]
|
|
pub async fn desktop_run_async(_: Args, _: u16, _: bool, _: tokio_util::sync::CancellationToken) -> std::io::Result<()> {
|
|
Ok(())
|
|
}
|
|
|
|
pub async fn mobile_run_async(
|
|
args: Args,
|
|
tun_mtu: u16,
|
|
_packet_information: bool,
|
|
shutdown_token: tokio_util::sync::CancellationToken,
|
|
) -> std::io::Result<()> {
|
|
let mut config = tun::Configuration::default();
|
|
|
|
#[cfg(unix)]
|
|
if let Some(fd) = args.tun_fd {
|
|
config.raw_fd(fd);
|
|
if let Some(v) = args.close_fd_on_drop {
|
|
config.close_fd_on_drop(v);
|
|
};
|
|
} else if let Some(ref tun) = args.tun {
|
|
config.tun_name(tun);
|
|
}
|
|
#[cfg(windows)]
|
|
if let Some(ref tun) = args.tun {
|
|
config.tun_name(tun);
|
|
}
|
|
|
|
#[cfg(any(target_os = "ios", target_os = "macos"))]
|
|
config.platform_config(|config| {
|
|
config.packet_information(_packet_information);
|
|
});
|
|
|
|
let device = tun::create_as_async(&config).map_err(std::io::Error::from)?;
|
|
let join_handle = tokio::spawn(crate::run(device, tun_mtu, args, shutdown_token));
|
|
|
|
Ok(join_handle.await.map_err(std::io::Error::from)??)
|
|
}
|
|
|
|
pub fn mobile_run(args: Args, tun_mtu: u16, _packet_information: bool) -> c_int {
|
|
let shutdown_token = tokio_util::sync::CancellationToken::new();
|
|
if let Ok(mut lock) = TUN_QUIT.lock() {
|
|
if lock.is_some() {
|
|
log::error!("tun2proxy already started");
|
|
return -1;
|
|
}
|
|
*lock = Some(shutdown_token.clone());
|
|
} else {
|
|
log::error!("failed to lock tun2proxy quit token");
|
|
return -2;
|
|
}
|
|
|
|
let Ok(rt) = tokio::runtime::Builder::new_multi_thread().enable_all().build() else {
|
|
log::error!("failed to create tokio runtime with");
|
|
return -1;
|
|
};
|
|
match rt.block_on(mobile_run_async(args, tun_mtu, _packet_information, shutdown_token)) {
|
|
Ok(_) => 0,
|
|
Err(e) => {
|
|
log::error!("failed to run tun2proxy with error: {:?}", e);
|
|
-2
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn mobile_stop() -> c_int {
|
|
if let Ok(mut lock) = TUN_QUIT.lock() {
|
|
if let Some(shutdown_token) = lock.take() {
|
|
shutdown_token.cancel();
|
|
return 0;
|
|
}
|
|
}
|
|
-1
|
|
}
|
|
|