From 14d3798a48074c38c383451b9f105128d40758e1 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 28 Sep 2016 11:26:49 -0600 Subject: [PATCH] mkdir and rmdir --- kernel/syscall/fs.rs | 44 +++++++++++++++++++++++++++++++++++++++++++ kernel/syscall/mod.rs | 2 ++ 2 files changed, 46 insertions(+) diff --git a/kernel/syscall/fs.rs b/kernel/syscall/fs.rs index e79e4c0..17ffec6 100644 --- a/kernel/syscall/fs.rs +++ b/kernel/syscall/fs.rs @@ -62,6 +62,50 @@ pub fn open(path: &[u8], flags: usize) -> Result { }).ok_or(Error::new(EMFILE)) } +/// mkdir syscall +pub fn mkdir(path: &[u8], mode: usize) -> Result { + let path_canon = { + let contexts = context::contexts(); + let context_lock = contexts.current().ok_or(Error::new(ESRCH))?; + let context = context_lock.read(); + context.canonicalize(path) + }; + + let mut parts = path_canon.splitn(2, |&b| b == b':'); + let namespace_opt = parts.next(); + let reference_opt = parts.next(); + + let namespace = namespace_opt.ok_or(Error::new(ENOENT))?; + let scheme = { + let schemes = scheme::schemes(); + let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?; + scheme.clone() + }; + scheme.mkdir(reference_opt.unwrap_or(b""), mode) +} + +/// rmdir syscall +pub fn rmdir(path: &[u8]) -> Result { + let path_canon = { + let contexts = context::contexts(); + let context_lock = contexts.current().ok_or(Error::new(ESRCH))?; + let context = context_lock.read(); + context.canonicalize(path) + }; + + let mut parts = path_canon.splitn(2, |&b| b == b':'); + let namespace_opt = parts.next(); + let reference_opt = parts.next(); + + let namespace = namespace_opt.ok_or(Error::new(ENOENT))?; + let scheme = { + let schemes = scheme::schemes(); + let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?; + scheme.clone() + }; + scheme.rmdir(reference_opt.unwrap_or(b"")) +} + /// Unlink syscall pub fn unlink(path: &[u8]) -> Result { let path_canon = { diff --git a/kernel/syscall/mod.rs b/kernel/syscall/mod.rs index 9592917..d799da0 100644 --- a/kernel/syscall/mod.rs +++ b/kernel/syscall/mod.rs @@ -38,6 +38,8 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize SYS_LSEEK => lseek(b, c, d), SYS_GETPID => getpid(), SYS_FSTAT => fstat(b, &mut validate_slice_mut(c as *mut Stat, 1)?[0]), + SYS_MKDIR => mkdir(validate_slice(b as *const u8, c)?, d), + SYS_RMDIR => rmdir(validate_slice(b as *const u8, c)?), SYS_DUP => dup(b), SYS_BRK => brk(b), SYS_FTRUNCATE => ftruncate(b, c),