diff --git a/Cargo.toml b/Cargo.toml index 1a224c1..7afb0e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,9 @@ nix = { version = "0.29", default-features = false, features = [ android_logger = "0.14" jni = { version = "0.21", default-features = false } +[target.'cfg(unix)'.dependencies] +daemonize = "0.5" + [target.'cfg(target_os = "windows")'.dependencies] windows-service = "0.7" diff --git a/src/args.rs b/src/args.rs index d7a5539..6233350 100644 --- a/src/args.rs +++ b/src/args.rs @@ -100,8 +100,7 @@ pub struct Args { #[arg(short, long, value_name = "level", value_enum, default_value = "info")] pub verbosity: ArgVerbosity, - /// Daemonize the process as Windows service - #[cfg(target_os = "windows")] + /// Daemonize for unix family or run as Windows service #[arg(long)] pub daemonize: bool, } @@ -144,7 +143,6 @@ impl Default for Args { udp_timeout: 10, verbosity: ArgVerbosity::Info, virtual_dns_pool: IpCidr::from_str("198.18.0.0/15").unwrap(), - #[cfg(target_os = "windows")] daemonize: false, } } diff --git a/src/bin/main.rs b/src/bin/main.rs index 8d4715f..a2b9b39 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -5,6 +5,19 @@ async fn main() -> Result<(), BoxError> { dotenvy::dotenv().ok(); let args = Args::parse_args(); + #[cfg(unix)] + if args.daemonize { + let stdout = std::fs::File::create("/tmp/tun2proxy.out")?; + let stderr = std::fs::File::create("/tmp/tun2proxy.err")?; + let daemonize = daemonize::Daemonize::new() + .working_directory("/tmp") + .umask(0o777) + .stdout(stdout) + .stderr(stderr) + .privileged_action(|| "Executed before drop privileges"); + let _ = daemonize.start()?; + } + #[cfg(target_os = "windows")] if args.daemonize { tun2proxy::win_svc::start_service()?;