0.2.11 - add daemon abstraction
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.2.10"
|
version = "0.2.11"
|
||||||
description = "A Rust library to access raw Redox system calls"
|
description = "A Rust library to access raw Redox system calls"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
authors = ["Jeremy Soller <jackpot51@gmail.com>"]
|
authors = ["Jeremy Soller <jackpot51@gmail.com>"]
|
||||||
|
|||||||
58
src/daemon.rs
Normal file
58
src/daemon.rs
Normal file
@@ -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: FnOnce(Daemon) -> !>(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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
#![feature(asm)]
|
#![feature(asm)]
|
||||||
#![feature(llvm_asm)]
|
#![feature(llvm_asm)]
|
||||||
|
#![feature(never_type)]
|
||||||
#![cfg_attr(not(test), no_std)]
|
#![cfg_attr(not(test), no_std)]
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -7,6 +8,7 @@ extern crate core;
|
|||||||
|
|
||||||
pub use self::arch::*;
|
pub use self::arch::*;
|
||||||
pub use self::call::*;
|
pub use self::call::*;
|
||||||
|
pub use self::daemon::*;
|
||||||
pub use self::data::*;
|
pub use self::data::*;
|
||||||
pub use self::error::*;
|
pub use self::error::*;
|
||||||
pub use self::flag::*;
|
pub use self::flag::*;
|
||||||
@@ -44,6 +46,9 @@ pub mod call;
|
|||||||
/// Complex structures that are used for some system calls
|
/// Complex structures that are used for some system calls
|
||||||
pub mod data;
|
pub mod data;
|
||||||
|
|
||||||
|
/// Wrapper to make daemons easier to write
|
||||||
|
pub mod daemon;
|
||||||
|
|
||||||
/// All errors that can be generated by a system call
|
/// All errors that can be generated by a system call
|
||||||
pub mod error;
|
pub mod error;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user