diff --git a/src/syscall/fs.rs b/src/syscall/fs.rs index 100214a67d992a2cdc4942b8e2d110a39eccb217..e2c70f26f6c0673f50f6d9a6b6e179a71d3947a2 100644 --- a/src/syscall/fs.rs +++ b/src/syscall/fs.rs @@ -13,27 +13,24 @@ use crate::syscall::flag::*; pub fn file_op(a: usize, fd: FileHandle, c: usize, d: usize) -> Result<usize> { - let (file, pid, uid, gid) = { - let contexts = context::contexts(); - let context_lock = contexts.current().ok_or(Error::new(ESRCH))?; - let context = context_lock.read(); - let file = context.get_file(fd).ok_or(Error::new(EBADF))?; - (file, context.id, context.euid, context.egid) + let (scheme_id, scheme_number, current_cid, current_uid, current_gid) = match context::current()?.read() { + // TODO: Avoid semi-expensive Arc::clone by only accessing by reference? + ref current => match current.get_file(fd).ok_or(Error::new(EBADF))?.description.read() { + ref desc => { + (desc.scheme, desc.number, current.id, current.euid, current.egid) + } + } }; - let scheme = { - let schemes = scheme::schemes(); - let scheme = schemes.get(file.description.read().scheme).ok_or(Error::new(EBADF))?; - Arc::clone(scheme) - }; + let scheme = Arc::clone(scheme::schemes().get(scheme_id).ok_or(Error::new(EBADF))?); let mut packet = Packet { id: 0, - pid: pid.into(), - uid, - gid, + pid: current_cid.into(), + uid: current_uid, + gid: current_gid, a, - b: file.description.read().number, + b: scheme_number, c, d };