From 7beb52a2bc6023bc83cb1cb54be2b3b663f29cd3 Mon Sep 17 00:00:00 2001 From: Pat Hickey Date: Wed, 13 Jan 2021 14:23:59 -0800 Subject: [PATCH] i guess this is a way to do refs --- crates/wasi-c2/src/file.rs | 25 +++++++++++++++-------- crates/wasi-c2/src/snapshots/preview_1.rs | 2 +- 2 files changed, 18 insertions(+), 9 deletions(-) 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};