diff --git a/crates/wasi-c2/src/file.rs b/crates/wasi-c2/src/file.rs index 73d7a3abc5..03393f478d 100644 --- a/crates/wasi-c2/src/file.rs +++ b/crates/wasi-c2/src/file.rs @@ -1,6 +1,7 @@ use crate::Error; use bitflags::bitflags; use fs_set_times::SetTimes; +use std::cell::Ref; use std::ops::Deref; use system_interface::fs::FileIoExt; @@ -92,9 +93,9 @@ impl FileEntry { FileEntry { caps, file } } - pub fn get_cap(&self, caps: FileCaps) -> Result<&dyn WasiFile, Error> { + pub fn capable_of(&self, caps: FileCaps) -> Result<(), Error> { if self.caps.contains(caps) { - Ok(self.file.deref()) + Ok(()) } else { Err(Error::FileNotCapable { desired: caps, @@ -104,12 +105,9 @@ impl FileEntry { } pub fn drop_caps_to(&mut self, caps: FileCaps) -> Result<(), Error> { - if self.caps.contains(caps) { - self.caps = caps; - Ok(()) - } else { - Err(Error::NotCapable) - } + self.capable_of(caps)?; + self.caps = caps; + Ok(()) } pub fn get_fdstat(&self) -> Result { @@ -121,6 +119,17 @@ impl FileEntry { } } +pub trait FileEntryExt<'a> { + fn get_cap(self, caps: FileCaps) -> Result, Error>; +} + +impl<'a> FileEntryExt<'a> for Ref<'a, FileEntry> { + fn get_cap(self, caps: FileCaps) -> Result, Error> { + self.capable_of(caps)?; + Ok(Ref::map(self, |r| r.file.deref())) + } +} + bitflags! { pub struct FileCaps : u32 { const DATASYNC = 0b1; diff --git a/crates/wasi-c2/src/snapshots/preview_1.rs b/crates/wasi-c2/src/snapshots/preview_1.rs index 91ae2610b2..13fe6d307a 100644 --- a/crates/wasi-c2/src/snapshots/preview_1.rs +++ b/crates/wasi-c2/src/snapshots/preview_1.rs @@ -1,6 +1,6 @@ #![allow(unused_variables)] use crate::dir::{DirCaps, DirEntry, DirFdStat, ReaddirCursor, ReaddirEntity, TableDirExt}; -use crate::file::{FdFlags, FdStat, FileCaps, FileEntry, FileType, Filestat, OFlags}; +use crate::file::{FdFlags, FdStat, FileCaps, FileEntry, FileEntryExt, FileType, Filestat, OFlags}; use crate::sched::subscription::{RwEventFlags, SubscriptionResult}; use crate::sched::Poll; use crate::{Error, WasiCtx};