Replace syscall::Scheme with KernelScheme.

This commit is contained in:
4lDO2
2023-11-04 18:04:31 +01:00
parent 192d663d84
commit 036a4bdee4
19 changed files with 332 additions and 349 deletions
+23 -23
View File
@@ -7,11 +7,10 @@ use crate::context::file::{FileDescriptor, FileDescription};
use crate::context;
use crate::context::memory::{PageSpan, AddrSpace};
use crate::paging::{PAGE_SIZE, VirtualAddress, Page};
use crate::scheme::{self, FileHandle, OpenResult, current_caller_ctx, KernelScheme, SchemeId};
use crate::scheme::{self, FileHandle, OpenResult, KernelScheme, SchemeId, CallerCtx};
use crate::syscall::data::Stat;
use crate::syscall::error::*;
use crate::syscall::flag::*;
use crate::syscall::scheme::CallerCtx;
use super::usercopy::{UserSlice, UserSliceWo, UserSliceRo};
@@ -87,9 +86,9 @@ pub fn open(raw_path: UserSliceRo, flags: usize) -> Result<FileHandle> {
}
/// rmdir syscall
pub fn rmdir(raw_path: UserSliceRo) -> Result<usize> {
let (uid, gid, scheme_ns) = match context::current()?.read() {
ref context => (context.euid, context.egid, context.ens),
pub fn rmdir(raw_path: UserSliceRo) -> Result<()> {
let (scheme_ns, caller_ctx) = match context::current()?.read() {
ref context => (context.ens, context.caller_ctx()),
};
/*
@@ -107,13 +106,13 @@ pub fn rmdir(raw_path: UserSliceRo) -> Result<usize> {
let (_scheme_id, scheme) = schemes.get_name(scheme_ns, scheme_name).ok_or(Error::new(ENODEV))?;
Arc::clone(scheme)
};
scheme.rmdir(reference, uid, gid)
scheme.rmdir(reference, caller_ctx)
}
/// Unlink syscall
pub fn unlink(raw_path: UserSliceRo) -> Result<usize> {
let (uid, gid, scheme_ns) = match context::current()?.read() {
ref context => (context.euid, context.egid, context.ens),
pub fn unlink(raw_path: UserSliceRo) -> Result<()> {
let (scheme_ns, caller_ctx) = match context::current()?.read() {
ref context => (context.ens, context.caller_ctx()),
};
/*
let mut path_buf = BorrowedHtBuf::head()?;
@@ -130,11 +129,11 @@ pub fn unlink(raw_path: UserSliceRo) -> Result<usize> {
let (_scheme_id, scheme) = schemes.get_name(scheme_ns, scheme_name).ok_or(Error::new(ENODEV))?;
Arc::clone(scheme)
};
scheme.unlink(reference, uid, gid)
scheme.unlink(reference, caller_ctx)
}
/// Close syscall
pub fn close(fd: FileHandle) -> Result<usize> {
pub fn close(fd: FileHandle) -> Result<()> {
let file = {
let contexts = context::contexts();
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
@@ -146,8 +145,9 @@ pub fn close(fd: FileHandle) -> Result<usize> {
}
fn duplicate_file(fd: FileHandle, user_buf: UserSliceRo) -> Result<FileDescriptor> {
let file = context::current()?.read()
.get_file(fd).ok_or(Error::new(EBADF))?;
let (file, caller_ctx) = match context::current()?.read() {
ref context => (context.get_file(fd).ok_or(Error::new(EBADF))?, context.caller_ctx()),
};
if user_buf.is_empty() {
Ok(FileDescriptor {
@@ -164,7 +164,7 @@ fn duplicate_file(fd: FileHandle, user_buf: UserSliceRo) -> Result<FileDescripto
Arc::clone(scheme)
};
match scheme.kdup(description.number, user_buf, current_caller_ctx()?)? {
match scheme.kdup(description.number, user_buf, caller_ctx)? {
OpenResult::SchemeLocal(number) => Arc::new(RwLock::new(FileDescription {
namespace: description.namespace,
scheme: description.scheme,
@@ -309,9 +309,9 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize) -> Result<usize> {
}
}
pub fn frename(fd: FileHandle, raw_path: UserSliceRo) -> Result<usize> {
let (file, uid, gid, scheme_ns) = match context::current()?.read() {
ref context => (context.get_file(fd).ok_or(Error::new(EBADF))?, context.euid, context.egid, context.ens),
pub fn frename(fd: FileHandle, raw_path: UserSliceRo) -> Result<()> {
let (file, caller_ctx, scheme_ns) = match context::current()?.read() {
ref context => (context.get_file(fd).ok_or(Error::new(EBADF))?, CallerCtx { uid: context.euid, gid: context.egid, pid: context.id.get() }, context.ens),
};
/*
@@ -332,15 +332,15 @@ pub fn frename(fd: FileHandle, raw_path: UserSliceRo) -> Result<usize> {
let description = file.description.read();
if scheme_id == description.scheme {
scheme.frename(description.number, reference, uid, gid)
} else {
Err(Error::new(EXDEV))
if scheme_id != description.scheme {
return Err(Error::new(EXDEV));
}
scheme.frename(description.number, reference, caller_ctx)
}
/// File status
pub fn fstat(fd: FileHandle, user_buf: UserSliceWo) -> Result<usize> {
pub fn fstat(fd: FileHandle, user_buf: UserSliceWo) -> Result<()> {
file_op_generic_ext(fd, |scheme, scheme_id, _, number| {
scheme.kfstat(number, user_buf)?;
@@ -350,7 +350,7 @@ pub fn fstat(fd: FileHandle, user_buf: UserSliceWo) -> Result<usize> {
let st_dev = scheme_id.get().try_into().map_err(|_| Error::new(EOVERFLOW))?;
user_buf.advance(memoffset::offset_of!(Stat, st_dev)).and_then(|b| b.limit(8)).ok_or(Error::new(EIO))?.copy_from_slice(&u64::to_ne_bytes(st_dev))?;
Ok(0)
Ok(())
})
}
+12 -12
View File
@@ -16,7 +16,6 @@ pub use self::syscall::{
io,
number,
ptrace_event,
scheme,
};
pub use self::driver::*;
@@ -91,8 +90,8 @@ pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, stack
SYS_ARG_MSLICE => match a {
SYS_READ => file_op_generic(fd, |scheme, _, number| scheme.kread(number, UserSlice::wo(c, d)?)),
SYS_FPATH => file_op_generic(fd, |scheme, _, number| scheme.kfpath(number, UserSlice::wo(c, d)?)),
SYS_FSTAT => fstat(fd, UserSlice::wo(c, d)?),
SYS_FSTATVFS => file_op_generic(fd, |scheme, _, number| scheme.kfstatvfs(number, UserSlice::wo(c, d)?)),
SYS_FSTAT => fstat(fd, UserSlice::wo(c, d)?).map(|()| 0),
SYS_FSTATVFS => file_op_generic(fd, |scheme, _, number| scheme.kfstatvfs(number, UserSlice::wo(c, d)?).map(|()| 0)),
_ => return Err(Error::new(ENOSYS)),
},
@@ -106,18 +105,19 @@ pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, stack
#[cfg(target_pointer_width = "64")]
SYS_SENDFD => sendfd(fd, FileHandle::from(c), d, e as u64),
SYS_LSEEK => file_op_generic(fd, |scheme, _, number| Ok(scheme.seek(number, c as isize, d)? as usize)),
SYS_FCHMOD => file_op_generic(fd, |scheme, _, number| scheme.fchmod(number, c as u16)),
SYS_FCHOWN => file_op_generic(fd, |scheme, _, number| scheme.fchown(number, c as u32, d as u32)),
SYS_LSEEK => file_op_generic(fd, |scheme, _, number| scheme.seek(number, c as isize, d)),
SYS_FCHMOD => file_op_generic(fd, |scheme, _, number| scheme.fchmod(number, c as u16).map(|()| 0)),
SYS_FCHOWN => file_op_generic(fd, |scheme, _, number| scheme.fchown(number, c as u32, d as u32).map(|()| 0)),
SYS_FCNTL => fcntl(fd, c, d),
SYS_FEVENT => file_op_generic(fd, |scheme, _, number| Ok(scheme.fevent(number, EventFlags::from_bits_truncate(c))?.bits())),
SYS_FRENAME => frename(fd, UserSlice::ro(c, d)?),
SYS_FRENAME => frename(fd, UserSlice::ro(c, d)?).map(|()| 0),
SYS_FUNMAP => funmap(b, c),
SYS_FSYNC => file_op_generic(fd, |scheme, _, number| scheme.fsync(number)),
SYS_FTRUNCATE => file_op_generic(fd, |scheme, _, number| scheme.ftruncate(number, c)),
SYS_FSYNC => file_op_generic(fd, |scheme, _, number| scheme.fsync(number).map(|()| 0)),
// TODO: 64-bit lengths on 32-bit platforms
SYS_FTRUNCATE => file_op_generic(fd, |scheme, _, number| scheme.ftruncate(number, c).map(|()| 0)),
SYS_CLOSE => close(fd),
SYS_CLOSE => close(fd).map(|()| 0),
_ => return Err(Error::new(ENOSYS)),
}
@@ -125,8 +125,8 @@ pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, stack
},
SYS_CLASS_PATH => match a {
SYS_OPEN => open(UserSlice::ro(b, c)?, d).map(FileHandle::into),
SYS_RMDIR => rmdir(UserSlice::ro(b, c)?),
SYS_UNLINK => unlink(UserSlice::ro(b, c)?),
SYS_RMDIR => rmdir(UserSlice::ro(b, c)?).map(|()| 0),
SYS_UNLINK => unlink(UserSlice::ro(b, c)?).map(|()| 0),
_ => Err(Error::new(ENOSYS))
},
_ => match a {