diff --git a/lib.rs b/lib.rs index bda4da9..0c52084 100644 --- a/lib.rs +++ b/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/scheme/user.rs b/scheme/user.rs index b7355bb..589a8c9 100644 --- a/scheme/user.rs +++ b/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/syscall/fs.rs b/syscall/fs.rs index 30bd291..6f6a698 100644 --- a/syscall/fs.rs +++ b/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/syscall/mod.rs b/syscall/mod.rs index f197f84..69e53ec 100644 --- a/syscall/mod.rs +++ b/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/syscall/process.rs b/syscall/process.rs index 9c1c69a..f6b4b1e 100644 --- a/syscall/process.rs +++ b/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)?;