From 87ffd8b862f53d575ccee63a953489c038bc9940 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 28 Feb 2022 15:03:51 -0700 Subject: [PATCH] 0.2.11 - add daemon abstraction --- Cargo.toml | 2 +- src/daemon.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 5 +++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/daemon.rs diff --git a/Cargo.toml b/Cargo.toml index bedfb1a..856cab8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "redox_syscall" -version = "0.2.10" +version = "0.2.11" description = "A Rust library to access raw Redox system calls" license = "MIT" authors = ["Jeremy Soller "] diff --git a/src/daemon.rs b/src/daemon.rs new file mode 100644 index 0000000..11a97ca --- /dev/null +++ b/src/daemon.rs @@ -0,0 +1,58 @@ +use super::{ + clone, + CloneFlags, + close, + EIO, + Error, + exit, + pipe2, + read, + Result, + write, +}; + +#[must_use = "Daemon::ready must be called"] +pub struct Daemon { + write_pipe: usize, +} + +impl Daemon { + pub fn new !>(f: F) -> Result { + let mut pipes = [0; 2]; + pipe2(&mut pipes, 0)?; + + let [read_pipe, write_pipe] = pipes; + + if unsafe { clone(CloneFlags::empty())? } == 0 { + let _ = close(read_pipe); + + f(Daemon { + write_pipe, + }); + } else { + let _ = close(write_pipe); + + let mut data = [0]; + let res = read(read_pipe, &mut data); + let _ = close(read_pipe); + + if res? == 1 { + exit(data[0] as usize)?; + unreachable!(); + } else { + Err(Error::new(EIO)) + } + } + } + + pub fn ready(self) -> Result<()> { + let res = write(self.write_pipe, &[0]); + let _ = close(self.write_pipe); + + if res? == 1 { + Ok(()) + } else { + Err(Error::new(EIO)) + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 60c0c60..0af87b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ #![feature(asm)] #![feature(llvm_asm)] +#![feature(never_type)] #![cfg_attr(not(test), no_std)] #[cfg(test)] @@ -7,6 +8,7 @@ extern crate core; pub use self::arch::*; pub use self::call::*; +pub use self::daemon::*; pub use self::data::*; pub use self::error::*; pub use self::flag::*; @@ -44,6 +46,9 @@ pub mod call; /// Complex structures that are used for some system calls pub mod data; +/// Wrapper to make daemons easier to write +pub mod daemon; + /// All errors that can be generated by a system call pub mod error;