From a9c7a4e773382093ed8d8ead4afad560d921afda Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 15 Nov 2016 17:08:14 -0700 Subject: [PATCH] Update to add chmod --- scheme/user.rs | 8 ++++++++ syscall/fs.rs | 22 ++++++++++++++++++++++ syscall/mod.rs | 1 + 3 files changed, 31 insertions(+) diff --git a/scheme/user.rs b/scheme/user.rs index 3a8c4af..da19500 100644 --- a/scheme/user.rs +++ b/scheme/user.rs @@ -231,6 +231,14 @@ impl Scheme for UserScheme { 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)?; + let result = inner.call(SYS_CHMOD, address, path.len(), mode as usize); + let _ = inner.release(address); + result + } + fn rmdir(&self, path: &[u8], _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 c12dc89..b10a34a 100644 --- a/syscall/fs.rs +++ b/syscall/fs.rs @@ -166,6 +166,28 @@ pub fn mkdir(path: &[u8], mode: u16) -> Result { 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) = { + 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) + }; + + 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(ENODEV))?; + let scheme = { + let schemes = scheme::schemes(); + let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENODEV))?; + scheme.clone() + }; + scheme.chmod(reference_opt.unwrap_or(b""), mode, uid, gid) +} + /// rmdir syscall pub fn rmdir(path: &[u8]) -> Result { let (path_canon, uid, gid) = { diff --git a/syscall/mod.rs b/syscall/mod.rs index b34df1d..89058df 100644 --- a/syscall/mod.rs +++ b/syscall/mod.rs @@ -54,6 +54,7 @@ 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)?), _ => unreachable!()