i guess this is a way to do refs

This commit is contained in:
Pat Hickey
2021-01-13 14:23:59 -08:00
parent 8298ce9e4d
commit 7beb52a2bc
2 changed files with 18 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
use crate::Error; use crate::Error;
use bitflags::bitflags; use bitflags::bitflags;
use fs_set_times::SetTimes; use fs_set_times::SetTimes;
use std::cell::Ref;
use std::ops::Deref; use std::ops::Deref;
use system_interface::fs::FileIoExt; use system_interface::fs::FileIoExt;
@@ -92,9 +93,9 @@ impl FileEntry {
FileEntry { caps, file } 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) { if self.caps.contains(caps) {
Ok(self.file.deref()) Ok(())
} else { } else {
Err(Error::FileNotCapable { Err(Error::FileNotCapable {
desired: caps, desired: caps,
@@ -104,12 +105,9 @@ impl FileEntry {
} }
pub fn drop_caps_to(&mut self, caps: FileCaps) -> Result<(), Error> { pub fn drop_caps_to(&mut self, caps: FileCaps) -> Result<(), Error> {
if self.caps.contains(caps) { self.capable_of(caps)?;
self.caps = caps; self.caps = caps;
Ok(()) Ok(())
} else {
Err(Error::NotCapable)
}
} }
pub fn get_fdstat(&self) -> Result<FdStat, Error> { pub fn get_fdstat(&self) -> Result<FdStat, Error> {
@@ -121,6 +119,17 @@ impl FileEntry {
} }
} }
pub trait FileEntryExt<'a> {
fn get_cap(self, caps: FileCaps) -> Result<Ref<'a, dyn WasiFile>, Error>;
}
impl<'a> FileEntryExt<'a> for Ref<'a, FileEntry> {
fn get_cap(self, caps: FileCaps) -> Result<Ref<'a, dyn WasiFile>, Error> {
self.capable_of(caps)?;
Ok(Ref::map(self, |r| r.file.deref()))
}
}
bitflags! { bitflags! {
pub struct FileCaps : u32 { pub struct FileCaps : u32 {
const DATASYNC = 0b1; const DATASYNC = 0b1;

View File

@@ -1,6 +1,6 @@
#![allow(unused_variables)] #![allow(unused_variables)]
use crate::dir::{DirCaps, DirEntry, DirFdStat, ReaddirCursor, ReaddirEntity, TableDirExt}; 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::subscription::{RwEventFlags, SubscriptionResult};
use crate::sched::Poll; use crate::sched::Poll;
use crate::{Error, WasiCtx}; use crate::{Error, WasiCtx};