From c018bfe5ef278f4c2d7e6baba68239de2da50d06 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 25 Nov 2016 18:24:38 -0700 Subject: [PATCH] Implement O_DIRECTORY, switch to open for mkdir --- kernel/lib.rs | 6 +++--- kernel/scheme/user.rs | 8 -------- kernel/syscall/fs.rs | 24 +----------------------- kernel/syscall/mod.rs | 1 - kernel/syscall/process.rs | 2 +- libstd/libc/src/syscall.rs | 2 +- programs/contain/src/main.rs | 28 ++++++++++++++++++++++++---- rust | 2 +- schemes/redoxfs | 2 +- syscall | 2 +- 10 files changed, 33 insertions(+), 44 deletions(-) diff --git a/kernel/lib.rs b/kernel/lib.rs index bda4da9..0c52084 100644 --- a/kernel/lib.rs +++ b/kernel/lib.rs @@ -93,9 +93,9 @@ pub fn cpu_count() -> usize { pub extern fn userspace_init() { assert_eq!(syscall::chdir(b"initfs:bin"), Ok(0)); - assert_eq!(syscall::open(b"debug:", 0).map(FileHandle::into), Ok(0)); - assert_eq!(syscall::open(b"debug:", 0).map(FileHandle::into), Ok(1)); - assert_eq!(syscall::open(b"debug:", 0).map(FileHandle::into), Ok(2)); + assert_eq!(syscall::open(b"debug:", syscall::flag::O_RDONLY).map(FileHandle::into), Ok(0)); + assert_eq!(syscall::open(b"debug:", syscall::flag::O_WRONLY).map(FileHandle::into), Ok(1)); + assert_eq!(syscall::open(b"debug:", syscall::flag::O_WRONLY).map(FileHandle::into), Ok(2)); syscall::exec(b"initfs:bin/init", &[]).expect("failed to execute initfs:init"); diff --git a/kernel/scheme/user.rs b/kernel/scheme/user.rs index b7355bb..589a8c9 100644 --- a/kernel/scheme/user.rs +++ b/kernel/scheme/user.rs @@ -224,14 +224,6 @@ impl Scheme for UserScheme { result } - fn mkdir(&self, path: &[u8], mode: u16, _uid: u32, _gid: u32) -> Result { - let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?; - let address = inner.capture(path)?; - let result = inner.call(SYS_MKDIR, address, path.len(), mode as usize); - let _ = inner.release(address); - result - } - fn chmod(&self, path: &[u8], mode: u16, _uid: u32, _gid: u32) -> Result { let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?; let address = inner.capture(path)?; diff --git a/kernel/syscall/fs.rs b/kernel/syscall/fs.rs index 30bd291..6f6a698 100644 --- a/kernel/syscall/fs.rs +++ b/kernel/syscall/fs.rs @@ -49,7 +49,7 @@ pub fn file_op_mut_slice(a: usize, fd: FileHandle, slice: &mut [u8]) -> Result Result { - let fd = open(path, 0)?; + let fd = open(path, syscall::flag::O_RDONLY | syscall::flag::O_DIRECTORY)?; let mut stat = Stat::default(); let stat_res = file_op_mut_slice(syscall::number::SYS_FSTAT, fd, &mut stat); let _ = close(fd); @@ -144,28 +144,6 @@ pub fn pipe2(fds: &mut [usize], flags: usize) -> Result { } } -/// mkdir syscall -pub fn mkdir(path: &[u8], mode: u16) -> Result { - let (path_canon, uid, gid, scheme_ns) = { - let contexts = context::contexts(); - let context_lock = contexts.current().ok_or(Error::new(ESRCH))?; - let context = context_lock.read(); - (context.canonicalize(path), context.euid, context.egid, context.ens) - }; - - let mut parts = path_canon.splitn(2, |&b| b == b':'); - let scheme_name_opt = parts.next(); - let reference_opt = parts.next(); - - let scheme_name = scheme_name_opt.ok_or(Error::new(ENODEV))?; - let scheme = { - let schemes = scheme::schemes(); - let (_scheme_id, scheme) = schemes.get_name(scheme_ns, scheme_name).ok_or(Error::new(ENODEV))?; - scheme.clone() - }; - scheme.mkdir(reference_opt.unwrap_or(b""), mode, uid, gid) -} - /// chmod syscall pub fn chmod(path: &[u8], mode: u16) -> Result { let (path_canon, uid, gid, scheme_ns) = { diff --git a/kernel/syscall/mod.rs b/kernel/syscall/mod.rs index f197f84..69e53ec 100644 --- a/kernel/syscall/mod.rs +++ b/kernel/syscall/mod.rs @@ -61,7 +61,6 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize }, SYS_CLASS_PATH => match a { SYS_OPEN => open(validate_slice(b as *const u8, c)?, d).map(FileHandle::into), - SYS_MKDIR => mkdir(validate_slice(b as *const u8, c)?, d as u16), SYS_CHMOD => chmod(validate_slice(b as *const u8, c)?, d as u16), SYS_RMDIR => rmdir(validate_slice(b as *const u8, c)?), SYS_UNLINK => unlink(validate_slice(b as *const u8, c)?), diff --git a/kernel/syscall/process.rs b/kernel/syscall/process.rs index 9c1c69a..f6b4b1e 100644 --- a/kernel/syscall/process.rs +++ b/kernel/syscall/process.rs @@ -468,7 +468,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result { (context.euid, context.egid, context.canonicalize(path)) }; - let file = syscall::open(&canonical, 0)?; + let file = syscall::open(&canonical, syscall::flag::O_RDONLY)?; let mut stat = Stat::default(); syscall::file_op_mut_slice(syscall::number::SYS_FSTAT, file, &mut stat)?; diff --git a/libstd/libc/src/syscall.rs b/libstd/libc/src/syscall.rs index 7f44357..6a97833 100644 --- a/libstd/libc/src/syscall.rs +++ b/libstd/libc/src/syscall.rs @@ -9,7 +9,7 @@ pub use self::syscall::error::*; pub use self::syscall::flag::*; pub use self::syscall::{ clock_gettime, clone, execve as exec, exit, futex, getpid, kill, nanosleep, setregid, setreuid, waitpid, - chdir, chmod, getcwd, open, mkdir, rmdir, unlink, dup, pipe2, + chdir, chmod, getcwd, open, rmdir, unlink, dup, pipe2, read, write, fcntl, fpath, fstat, fsync, ftruncate, lseek, close }; diff --git a/programs/contain/src/main.rs b/programs/contain/src/main.rs index 4a3cbb6..c660b30 100644 --- a/programs/contain/src/main.rs +++ b/programs/contain/src/main.rs @@ -1,13 +1,13 @@ extern crate syscall; -use std::env; +use std::{env, thread}; use std::os::unix::process::CommandExt; use std::process::Command; pub fn main() { let mut args = env::args().skip(1); - let root = args.next(); + let root_opt = args.next(); let cmd = args.next().unwrap_or("sh".to_string()); @@ -16,8 +16,8 @@ pub fn main() { "tcp", "udp" ]; - - if root.is_none() { + + if root_opt.is_none() { names.push("file"); } @@ -28,6 +28,26 @@ pub fn main() { let new_ns = syscall::mkns(&name_ptrs).unwrap(); + let root_thread = if let Some(root) = root_opt { + Some(thread::spawn(move || { + syscall::setrens(-1isize as usize, new_ns).unwrap(); + let scheme_fd = syscall::open(":file", syscall::O_CREAT | syscall::O_RDWR | syscall::O_CLOEXEC).unwrap(); + syscall::setrens(-1isize as usize, syscall::getns().unwrap()).unwrap(); + + loop { + let mut packet = syscall::Packet::default(); + if syscall::read(scheme_fd, &mut packet).unwrap() == 0 { + break; + } + println!("{:?}", packet); + } + + let _ = syscall::close(scheme_fd); + })) + } else { + None + }; + let pid = unsafe { syscall::clone(0).unwrap() }; if pid == 0 { syscall::setrens(new_ns, new_ns).unwrap(); diff --git a/rust b/rust index 6733074..3a1bb2b 160000 --- a/rust +++ b/rust @@ -1 +1 @@ -Subproject commit 6733074c847767fd3e0425fcefb73226bde1f6a1 +Subproject commit 3a1bb2ba26a85bbea4c9be813a9a13d48ab448ac diff --git a/schemes/redoxfs b/schemes/redoxfs index dcaf5c7..25fe6d3 160000 --- a/schemes/redoxfs +++ b/schemes/redoxfs @@ -1 +1 @@ -Subproject commit dcaf5c76be265bbfa5013cf131f14fa79680a634 +Subproject commit 25fe6d382641184b447645d6a784316652eaed95 diff --git a/syscall b/syscall index 2835586..1908eea 160000 --- a/syscall +++ b/syscall @@ -1 +1 @@ -Subproject commit 2835586ee671b0777ef1a98ced9237269c472941 +Subproject commit 1908eea7e91142a058ae99c06edb2a9dd7efd692