Canonicalize input path for file and directory opens

This commit is contained in:
pjht 2024-11-10 11:31:03 -06:00
parent 9ec700f2e9
commit a345b1efdc
Signed by: pjht
GPG Key ID: 7B5F6AFBEC7EE78E
2 changed files with 21 additions and 29 deletions

View File

@ -7,7 +7,7 @@
use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut, SeekFrom};
use crate::os::mikros::ipc::rpc;
use crate::os::mikros::{Errno, syscalls};
use crate::path::{Path, PathBuf};
use crate::path::{Component, Path, PathBuf};
use crate::sys::time::SystemTime;
use crate::sys::unsupported;
use crate::{fmt, str};
@ -328,13 +328,14 @@ pub fn create_new(&mut self, _create_new: bool) {}
impl File {
pub fn open(path: &Path, _opts: &OpenOptions) -> io::Result<File> {
let path = path.canonicalize()?;
let vfs_pid = loop {
if let Some(pid) = syscalls::try_get_registered(0) {
break pid;
}
};
let open_res: Result<(u64, u64), Errno> = postcard::from_bytes(
&rpc::send_call(vfs_pid, 2, 2, &postcard::to_allocvec(path).unwrap()).get_return(),
&rpc::send_call(vfs_pid, 2, 2, &postcard::to_allocvec(&path).unwrap()).get_return(),
)
.unwrap();
let (fs_pid, fd) = open_res?;
@ -476,13 +477,14 @@ fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result {
}
pub fn readdir(path: &Path) -> io::Result<ReadDir> {
let path = path.canonicalize()?;
let vfs_pid = loop {
if let Some(pid) = syscalls::try_get_registered(0) {
break pid;
}
};
let open_res: Result<(u64, u64), Errno> = postcard::from_bytes(
&rpc::send_call(vfs_pid, 2, 6, &postcard::to_allocvec(path).unwrap()).get_return(),
&rpc::send_call(vfs_pid, 2, 6, &postcard::to_allocvec(&path).unwrap()).get_return(),
)
.unwrap();
let (fs_pid, fd) = open_res?;
@ -533,8 +535,20 @@ pub fn lstat(_p: &Path) -> io::Result<FileAttr> {
unsupported()
}
pub fn canonicalize(_p: &Path) -> io::Result<PathBuf> {
unsupported()
pub fn canonicalize(path: &Path) -> io::Result<PathBuf> {
let path = crate::path::absolute(path)?;
Ok(path.components().fold(PathBuf::from("/"), |mut buf, component| match component {
Component::Prefix(_) => unreachable!(),
Component::RootDir | Component::Normal(_) => {
buf.push(component);
buf
}
Component::CurDir => buf,
Component::ParentDir => {
buf.pop();
buf
}
}))
}
pub fn copy(_from: &Path, _to: &Path) -> io::Result<u64> {

View File

@ -4,7 +4,7 @@
use crate::marker::PhantomData;
use crate::os::mikros::Errno;
use crate::os::mikros::ipc::rpc;
use crate::path::{self, Component, Path, PathBuf};
use crate::path::{self, PathBuf};
use crate::sync::Mutex;
use crate::{fmt, io};
@ -160,30 +160,8 @@ pub fn getcwd() -> io::Result<PathBuf> {
Ok(CWD.lock().unwrap().clone().unwrap())
}
fn canonicalize_path(path: &Path) -> PathBuf {
path.components().fold(PathBuf::from("/"), |mut buf, component| match component {
Component::Prefix(_) => unreachable!(),
Component::RootDir | Component::Normal(_) => {
buf.push(component);
buf
}
Component::CurDir => buf,
Component::ParentDir => {
buf.pop();
buf
}
})
}
pub fn chdir(path: &path::Path) -> io::Result<()> {
let cwd = getcwd()?;
let abs_path = if path.is_relative() {
let mut abs_path = cwd.clone();
abs_path.push(path);
canonicalize_path(&abs_path)
} else {
path.to_owned()
};
let abs_path = path.canonicalize()?;
// Try to open the given directory, if it fails it's not a valid directory.
// Use Metadata instead once it's implemented.
crate::fs::read_dir(&abs_path)?;