diff --git a/src/data.rs b/src/data.rs new file mode 100644 index 0000000000..399950bcc9 --- /dev/null +++ b/src/data.rs @@ -0,0 +1,69 @@ +use core::ops::{Deref, DerefMut}; +use core::{mem, slice}; + +#[derive(Copy, Clone, Debug, Default)] +#[repr(packed)] +pub struct Packet { + pub id: usize, + pub a: usize, + pub b: usize, + pub c: usize, + pub d: usize +} + +impl Deref for Packet { + type Target = [u8]; + fn deref(&self) -> &[u8] { + unsafe { + slice::from_raw_parts(self as *const Packet as *const u8, mem::size_of::()) as &[u8] + } + } +} + +impl DerefMut for Packet { + fn deref_mut(&mut self) -> &mut [u8] { + unsafe { + slice::from_raw_parts_mut(self as *mut Packet as *mut u8, mem::size_of::()) as &mut [u8] + } + } +} + +#[derive(Copy, Clone, Debug, Default)] +#[repr(packed)] +pub struct Stat { + pub st_dev: u16, + pub st_ino: u16, + pub st_mode: u16, + pub st_nlink: u16, + pub st_uid: u16, + pub st_gid: u16, + pub st_rdev: u16, + pub st_size: u32, + pub st_atime: u32, + pub st_mtime: u32, + pub st_ctime: u32 +} + +impl Deref for Stat { + type Target = [u8]; + fn deref(&self) -> &[u8] { + unsafe { + slice::from_raw_parts(self as *const Stat as *const u8, mem::size_of::()) as &[u8] + } + } +} + +impl DerefMut for Stat { + fn deref_mut(&mut self) -> &mut [u8] { + unsafe { + slice::from_raw_parts_mut(self as *mut Stat as *mut u8, mem::size_of::()) as &mut [u8] + } + } +} + +#[derive(Copy, Clone, Debug, Default)] +#[repr(packed)] +pub struct TimeSpec { + pub tv_sec: i64, + pub tv_nsec: i32, +} diff --git a/src/flag.rs b/src/flag.rs new file mode 100644 index 0000000000..fa00558e82 --- /dev/null +++ b/src/flag.rs @@ -0,0 +1,40 @@ +pub const CLONE_VM: usize = 0x100; +pub const CLONE_FS: usize = 0x200; +pub const CLONE_FILES: usize = 0x400; +pub const CLONE_VFORK: usize = 0x4000; +/// Mark this clone as supervised. +/// +/// This means that the process can run in supervised mode, even not being connected to +/// a supervisor yet. In other words, the parent can later on supervise the process and handle +/// the potential blocking syscall. +/// +/// This is an important security measure, since otherwise the process would be able to fork it +/// self right after starting, making supervising it impossible. +pub const CLONE_SUPERVISE: usize = 0x400000; +pub const CLOCK_REALTIME: usize = 1; +pub const CLOCK_MONOTONIC: usize = 4; + +pub const MODE_DIR: u16 = 0x4000; +pub const MODE_FILE: u16 = 0x8000; +pub const MODE_ALL: u16 = MODE_DIR | MODE_FILE; + +pub const FUTEX_WAIT: usize = 0; +pub const FUTEX_WAKE: usize = 1; +pub const FUTEX_REQUEUE: usize = 2; + +pub const SEEK_SET: usize = 0; +pub const SEEK_CUR: usize = 1; +pub const SEEK_END: usize = 2; + +pub const O_RDONLY: usize = 0; +pub const O_WRONLY: usize = 1; +pub const O_RDWR: usize = 2; +pub const O_NONBLOCK: usize = 4; +pub const O_APPEND: usize = 8; +pub const O_SHLOCK: usize = 0x10; +pub const O_EXLOCK: usize = 0x20; +pub const O_ASYNC: usize = 0x40; +pub const O_FSYNC: usize = 0x80; +pub const O_CREAT: usize = 0x200; +pub const O_TRUNC: usize = 0x400; +pub const O_EXCL: usize = 0x800; diff --git a/src/lib.rs b/src/lib.rs index e55ed4426d..099f61fdb0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,9 @@ #![no_std] pub use self::arch::*; +pub use self::data::*; pub use self::error::*; +pub use self::flag::*; pub use self::number::*; pub use self::scheme::*; @@ -14,76 +16,16 @@ mod arch; #[path="x86_64.rs"] mod arch; +pub mod data; + pub mod error; +pub mod flag; + pub mod number; pub mod scheme; -pub const CLONE_VM: usize = 0x100; -pub const CLONE_FS: usize = 0x200; -pub const CLONE_FILES: usize = 0x400; -pub const CLONE_VFORK: usize = 0x4000; -/// Mark this clone as supervised. -/// -/// This means that the process can run in supervised mode, even not being connected to -/// a supervisor yet. In other words, the parent can later on supervise the process and handle -/// the potential blocking syscall. -/// -/// This is an important security measure, since otherwise the process would be able to fork it -/// self right after starting, making supervising it impossible. -pub const CLONE_SUPERVISE: usize = 0x400000; -pub const CLOCK_REALTIME: usize = 1; -pub const CLOCK_MONOTONIC: usize = 4; - -pub const MODE_DIR: u16 = 0x4000; -pub const MODE_FILE: u16 = 0x8000; -pub const MODE_ALL: u16 = MODE_DIR | MODE_FILE; - -pub const FUTEX_WAIT: usize = 0; -pub const FUTEX_WAKE: usize = 1; -pub const FUTEX_REQUEUE: usize = 2; - -pub const SEEK_SET: usize = 0; -pub const SEEK_CUR: usize = 1; -pub const SEEK_END: usize = 2; - -pub const O_RDONLY: usize = 0; -pub const O_WRONLY: usize = 1; -pub const O_RDWR: usize = 2; -pub const O_NONBLOCK: usize = 4; -pub const O_APPEND: usize = 8; -pub const O_SHLOCK: usize = 0x10; -pub const O_EXLOCK: usize = 0x20; -pub const O_ASYNC: usize = 0x40; -pub const O_FSYNC: usize = 0x80; -pub const O_CREAT: usize = 0x200; -pub const O_TRUNC: usize = 0x400; -pub const O_EXCL: usize = 0x800; - -#[derive(Copy, Clone, Debug, Default)] -#[repr(packed)] -pub struct Stat { - pub st_dev: u16, - pub st_ino: u16, - pub st_mode: u16, - pub st_nlink: u16, - pub st_uid: u16, - pub st_gid: u16, - pub st_rdev: u16, - pub st_size: u32, - pub st_atime: u32, - pub st_mtime: u32, - pub st_ctime: u32 -} - -#[derive(Copy, Clone, Debug, Default)] -#[repr(packed)] -pub struct TimeSpec { - pub tv_sec: i64, - pub tv_nsec: i32, -} - pub unsafe fn brk(addr: usize) -> Result { syscall1(SYS_BRK, addr) } diff --git a/src/scheme.rs b/src/scheme.rs index 40405c405e..6a857d1518 100644 --- a/src/scheme.rs +++ b/src/scheme.rs @@ -1,35 +1,7 @@ -use core::ops::{Deref, DerefMut}; -use core::{mem, slice}; +use core::slice; use super::*; -#[derive(Copy, Clone, Debug, Default)] -#[repr(packed)] -pub struct Packet { - pub id: usize, - pub a: usize, - pub b: usize, - pub c: usize, - pub d: usize -} - -impl Deref for Packet { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const Packet as *const u8, mem::size_of::()) as &[u8] - } - } -} - -impl DerefMut for Packet { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut Packet as *mut u8, mem::size_of::()) as &mut [u8] - } - } -} - pub trait Scheme { fn handle(&self, packet: &mut Packet) { packet.a = Error::mux(match packet.a { @@ -69,11 +41,6 @@ pub trait Scheme { Err(Error::new(ENOENT)) } - #[allow(unused_variables)] - fn stat(&self, path: &[u8], stat: &mut Stat) -> Result { - Err(Error::new(ENOENT)) - } - #[allow(unused_variables)] fn unlink(&self, path: &[u8]) -> Result { Err(Error::new(ENOENT))