Modify hostfs to support mode and some ops for dir
This commit is contained in:
parent
a3e2f54a6d
commit
98dd3e8af3
@ -3,7 +3,7 @@ use alloc::sync::{Arc, Weak};
|
|||||||
use core::any::Any;
|
use core::any::Any;
|
||||||
use rcore_fs::vfs::*;
|
use rcore_fs::vfs::*;
|
||||||
use std::io::{Read, Seek, SeekFrom, Write};
|
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::path::{Path, PathBuf};
|
||||||
use std::sync::{SgxMutex as Mutex, SgxMutexGuard as MutexGuard};
|
use std::sync::{SgxMutex as Mutex, SgxMutexGuard as MutexGuard};
|
||||||
use std::untrusted::fs;
|
use std::untrusted::fs;
|
||||||
@ -76,6 +76,9 @@ macro_rules! try_std {
|
|||||||
|
|
||||||
impl INode for HNode {
|
impl INode for HNode {
|
||||||
fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result<usize> {
|
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 mut guard = self.open_file()?;
|
||||||
let file = guard.as_mut().unwrap();
|
let file = guard.as_mut().unwrap();
|
||||||
try_std!(file.seek(SeekFrom::Start(offset as u64)));
|
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> {
|
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 mut guard = self.open_file()?;
|
||||||
let file = guard.as_mut().unwrap();
|
let file = guard.as_mut().unwrap();
|
||||||
try_std!(file.seek(SeekFrom::Start(offset as u64)));
|
try_std!(file.seek(SeekFrom::Start(offset as u64)));
|
||||||
@ -109,7 +115,12 @@ impl INode for HNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn set_metadata(&self, metadata: &Metadata) -> Result<()> {
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,6 +139,9 @@ impl INode for HNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn resize(&self, len: usize) -> Result<()> {
|
fn resize(&self, len: usize) -> Result<()> {
|
||||||
|
if !self.path.is_file() {
|
||||||
|
return Err(FsError::NotFile);
|
||||||
|
}
|
||||||
let mut guard = self.open_file()?;
|
let mut guard = self.open_file()?;
|
||||||
let file = guard.as_mut().unwrap();
|
let file = guard.as_mut().unwrap();
|
||||||
try_std!(file.set_len(len as u64));
|
try_std!(file.set_len(len as u64));
|
||||||
@ -139,12 +153,15 @@ impl INode for HNode {
|
|||||||
if new_path.exists() {
|
if new_path.exists() {
|
||||||
return Err(FsError::EntryExist);
|
return Err(FsError::EntryExist);
|
||||||
}
|
}
|
||||||
|
let perms = fs::Permissions::from_mode(mode as u32);
|
||||||
match type_ {
|
match type_ {
|
||||||
FileType::File => {
|
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 => {
|
FileType::Dir => {
|
||||||
try_std!(fs::create_dir(&new_path));
|
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");
|
warn!("only support creating regular file or directory in HostFS");
|
||||||
@ -262,14 +279,10 @@ impl INode for HNode {
|
|||||||
impl HNode {
|
impl HNode {
|
||||||
/// Ensure to open the file and store a `File` into `self.file`,
|
/// Ensure to open the file and store a `File` into `self.file`,
|
||||||
/// return the `MutexGuard`.
|
/// return the `MutexGuard`.
|
||||||
/// If the type of `self.path` is not file, then return Err
|
|
||||||
fn open_file(&self) -> Result<MutexGuard<Option<fs::File>>> {
|
fn open_file(&self) -> Result<MutexGuard<Option<fs::File>>> {
|
||||||
if !self.path.exists() {
|
if !self.path.exists() {
|
||||||
return Err(FsError::EntryNotFound);
|
return Err(FsError::EntryNotFound);
|
||||||
}
|
}
|
||||||
if !self.path.is_file() {
|
|
||||||
return Err(FsError::NotFile);
|
|
||||||
}
|
|
||||||
let mut maybe_file = self.file.lock().unwrap();
|
let mut maybe_file = self.file.lock().unwrap();
|
||||||
if maybe_file.is_none() {
|
if maybe_file.is_none() {
|
||||||
let file = try_std!(fs::OpenOptions::new()
|
let file = try_std!(fs::OpenOptions::new()
|
||||||
|
Loading…
Reference in New Issue
Block a user