feature: add Stat struct and fstatat()

This commit is contained in:
2021-11-03 16:15:22 +02:00
parent ad17789d94
commit 53a432bc05
15 changed files with 130 additions and 67 deletions
+28 -1
View File
@@ -5,7 +5,10 @@ use core::mem::size_of;
use core::time::Duration;
use error::Errno;
use libcommon::{Read, Write};
use syscall::abi;
use syscall::{
abi,
stat::{Stat, AT_FDCWD},
};
fn translate(virt: usize) -> Option<usize> {
let mut res: usize;
@@ -19,6 +22,13 @@ fn translate(virt: usize) -> Option<usize> {
}
}
fn validate_user_ptr_struct<'a, T>(base: usize) -> Result<&'a mut T, Errno> {
let bytes = validate_user_ptr(base, size_of::<T>())?;
Ok(unsafe {
&mut *(bytes.as_mut_ptr() as *mut T)
})
}
fn validate_user_ptr<'a>(base: usize, len: usize) -> Result<&'a mut [u8], Errno> {
if base > mem::KERNEL_OFFSET || base + len > mem::KERNEL_OFFSET {
warnln!(
@@ -133,6 +143,23 @@ pub unsafe fn syscall(num: usize, args: &[usize]) -> Result<usize, Errno> {
io.file(args[0])?.write(buf)
}
abi::SYS_FSTATAT => {
let proc = Process::current();
let mut io = proc.io.lock();
let fd = args[0];
let filename = validate_user_str(args[1], 256)?;
let buf = validate_user_ptr_struct::<Stat>(args[2])?;
// TODO "self" flag
let at = if fd as i32 != AT_FDCWD {
todo!();
} else {
None
};
let node = io.ioctx().find(at, filename, true)?;
node.stat(buf)?;
Ok(0)
}
// Extra system calls
abi::SYS_EX_DEBUG_TRACE => {