chiark / gitweb /
daemon: wip
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 25 Sep 2022 13:47:33 +0000 (14:47 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 25 Sep 2022 13:47:33 +0000 (14:47 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
server/daemon.rs
server/server.rs

index 14cd1c2c1fe8a97287cc36fa2bf0d1931b2dc0cc..02e0068167d1b1fbff29a92cbcca4ff03726c1db 100644 (file)
@@ -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())
index 285270ade6703a9a633db9422094a4ed3033a7d0..02af6f8292142901baf1be6765a3e99fccc7087c 100644 (file)
@@ -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<Daemoniser>) {
   let mut tasks: Vec<(
     JoinHandle<AE>,
     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;