get path filestat on a dir
This commit is contained in:
@@ -26,6 +26,7 @@ pub trait WasiDir {
|
|||||||
fn unlink_file(&self, path: &str) -> Result<(), Error>;
|
fn unlink_file(&self, path: &str) -> Result<(), Error>;
|
||||||
fn read_link(&self, path: &str) -> Result<PathBuf, Error>;
|
fn read_link(&self, path: &str) -> Result<PathBuf, Error>;
|
||||||
fn get_filestat(&self) -> Result<Filestat, Error>;
|
fn get_filestat(&self) -> Result<Filestat, Error>;
|
||||||
|
fn get_path_filestat(&self, path: &str) -> Result<Filestat, Error>;
|
||||||
fn rename(&self, path: &str, dest_dir: &dyn WasiDir, dest_path: &str) -> Result<(), Error>;
|
fn rename(&self, path: &str, dest_dir: &dyn WasiDir, dest_path: &str) -> Result<(), Error>;
|
||||||
fn hard_link(
|
fn hard_link(
|
||||||
&self,
|
&self,
|
||||||
@@ -349,7 +350,21 @@ impl WasiDir for cap_std::fs::Dir {
|
|||||||
Ok(link)
|
Ok(link)
|
||||||
}
|
}
|
||||||
fn get_filestat(&self) -> Result<Filestat, Error> {
|
fn get_filestat(&self) -> Result<Filestat, Error> {
|
||||||
let meta = self.metadata(".")?;
|
let meta = self.dir_metadata()?;
|
||||||
|
use cap_fs_ext::MetadataExt;
|
||||||
|
Ok(Filestat {
|
||||||
|
device_id: meta.dev(),
|
||||||
|
inode: meta.ino(),
|
||||||
|
filetype: FileType::from(&meta.file_type()),
|
||||||
|
nlink: meta.nlink(),
|
||||||
|
size: meta.len(),
|
||||||
|
atim: meta.accessed().map(|t| Some(t.into_std())).unwrap_or(None),
|
||||||
|
mtim: meta.modified().map(|t| Some(t.into_std())).unwrap_or(None),
|
||||||
|
ctim: meta.created().map(|t| Some(t.into_std())).unwrap_or(None),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
fn get_path_filestat(&self, path: &str) -> Result<Filestat, Error> {
|
||||||
|
let meta = self.metadata(Path::new(path))?;
|
||||||
use cap_fs_ext::MetadataExt;
|
use cap_fs_ext::MetadataExt;
|
||||||
Ok(Filestat {
|
Ok(Filestat {
|
||||||
device_id: meta.dev(),
|
device_id: meta.dev(),
|
||||||
|
|||||||
@@ -647,7 +647,8 @@ impl<'a> wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx {
|
|||||||
let table = self.table();
|
let table = self.table();
|
||||||
let dir_entry: Ref<DirEntry> = table.get(u32::from(dirfd))?;
|
let dir_entry: Ref<DirEntry> = table.get(u32::from(dirfd))?;
|
||||||
let dir = dir_entry.get_cap(DirCaps::PATH_FILESTAT_GET)?;
|
let dir = dir_entry.get_cap(DirCaps::PATH_FILESTAT_GET)?;
|
||||||
todo!()
|
let filestat = dir.get_path_filestat(path.as_str()?.deref())?;
|
||||||
|
Ok(types::Filestat::from(filestat))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn path_filestat_set_times(
|
fn path_filestat_set_times(
|
||||||
|
|||||||
Reference in New Issue
Block a user