i guess this is a way to do refs
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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};
|
||||||
|
|||||||
Reference in New Issue
Block a user