Modify hostfs to support mode and some ops for dir

This commit is contained in:
LI Qing 2022-07-05 10:56:12 +08:00 committed by volcano
parent a3e2f54a6d
commit 98dd3e8af3

@ -3,7 +3,7 @@ use alloc::sync::{Arc, Weak};
use core::any::Any;
use rcore_fs::vfs::*;
use std::io::{Read, Seek, SeekFrom, Write};
use std::os::unix::fs::{DirEntryExt, FileTypeExt};
use std::os::unix::fs::{DirEntryExt, FileTypeExt, PermissionsExt};
use std::path::{Path, PathBuf};
use std::sync::{SgxMutex as Mutex, SgxMutexGuard as MutexGuard};
use std::untrusted::fs;
@ -76,6 +76,9 @@ macro_rules! try_std {
impl INode for HNode {
fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize> {
if !self.path.is_file() {
return Err(FsError::NotFile);
}
let mut guard = self.open_file()?;
let file = guard.as_mut().unwrap();
try_std!(file.seek(SeekFrom::Start(offset as u64)));
@ -84,6 +87,9 @@ impl INode for HNode {
}
fn write_at(&self, offset: usize, buf: &[u8]) -> Result<usize> {
if !self.path.is_file() {
return Err(FsError::NotFile);
}
let mut guard = self.open_file()?;
let file = guard.as_mut().unwrap();
try_std!(file.seek(SeekFrom::Start(offset as u64)));
@ -109,7 +115,12 @@ impl INode for HNode {
}
fn set_metadata(&self, metadata: &Metadata) -> Result<()> {
warn!("HostFS: set_metadata() is unimplemented");
warn!(
"HostFS: set_metadata() only support chmod: {:#o}",
metadata.mode
);
let perms = fs::Permissions::from_mode(metadata.mode as u32);
try_std!(fs::set_permissions(&self.path, perms));
Ok(())
}
@ -128,6 +139,9 @@ impl INode for HNode {
}
fn resize(&self, len: usize) -> Result<()> {
if !self.path.is_file() {
return Err(FsError::NotFile);
}
let mut guard = self.open_file()?;
let file = guard.as_mut().unwrap();
try_std!(file.set_len(len as u64));
@ -139,12 +153,15 @@ impl INode for HNode {
if new_path.exists() {
return Err(FsError::EntryExist);
}
let perms = fs::Permissions::from_mode(mode as u32);
match type_ {
FileType::File => {
try_std!(fs::File::create(&new_path));
let file = try_std!(fs::File::create(&new_path));
try_std!(file.set_permissions(perms));
}
FileType::Dir => {
try_std!(fs::create_dir(&new_path));
try_std!(fs::set_permissions(&new_path, perms));
}
_ => {
warn!("only support creating regular file or directory in HostFS");
@ -262,14 +279,10 @@ impl INode for HNode {
impl HNode {
/// Ensure to open the file and store a `File` into `self.file`,
/// return the `MutexGuard`.
/// If the type of `self.path` is not file, then return Err
fn open_file(&self) -> Result<MutexGuard<Option<fs::File>>> {
if !self.path.exists() {
return Err(FsError::EntryNotFound);
}
if !self.path.is_file() {
return Err(FsError::NotFile);
}
let mut maybe_file = self.file.lock().unwrap();
if maybe_file.is_none() {
let file = try_std!(fs::OpenOptions::new()