From: Ian Jackson Date: Sun, 25 Sep 2022 13:47:33 +0000 (+0100) Subject: daemon: wip X-Git-Tag: hippotat/1.0.0~61 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=f50267db99398cd791ecf83f9765a28950dde318;p=hippotat.git daemon: wip Signed-off-by: Ian Jackson --- diff --git a/server/daemon.rs b/server/daemon.rs index 14cd1c2..02e0068 100644 --- a/server/daemon.rs +++ b/server/daemon.rs @@ -151,6 +151,7 @@ unsafe fn intermediate(child: Pid, st_wfd: RawFd) -> ! { } impl Daemoniser { + /// Start daemonising - call before any threads created! pub fn phase1() -> Self { unsafe { let null_fd = open(cstr!(b"/dev/null\0"), OFlag::O_RDWR, Mode::empty()) diff --git a/server/server.rs b/server/server.rs index 285270a..02af6f8 100644 --- a/server/server.rs +++ b/server/server.rs @@ -9,6 +9,7 @@ mod suser; mod slocal; mod sweb; +pub use daemon::Daemoniser; pub use sweb::{WebRequest, WebResponse, WebResponseBody}; pub use suser::User; @@ -19,6 +20,10 @@ pub struct Opts { #[structopt(flatten)] pub config: config::Opts, + + /// Daemonise + #[structopt(long)] + daemon: bool, } pub const METADATA_MAX_LEN: usize = MAX_OVERHEAD; @@ -116,9 +121,19 @@ pub async fn route_packet(global: &Global, } } -#[tokio::main] -async fn main() { +fn main() { let opts = Opts::from_args(); + let daemon = if opts.daemon { + Some(Daemoniser::phase1()) + } else { + None + }; + + async_main(opts, daemon); +} + +#[tokio::main] +async fn async_main(opts: Opts, daemon: Option) { let mut tasks: Vec<( JoinHandle, String, @@ -221,6 +236,10 @@ async fn main() { Ok(()) }); + if let Some(daemon) = daemon { + daemon.complete(); + } + let (output, died_i, _) = future::select_all( tasks.iter_mut().map(|e| &mut e.0) ).await;