Struct wasi_cap_std_sync::file::File
source · pub struct File(_);
Implementations§
source§impl File
impl File
sourcepub fn from_cap_std(file: File) -> Self
pub fn from_cap_std(file: File) -> Self
Examples found in repository?
src/dir.rs (line 80)
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
pub fn open_file_(
&self,
symlink_follow: bool,
path: &str,
oflags: OFlags,
read: bool,
write: bool,
fdflags: FdFlags,
) -> Result<File, Error> {
use cap_fs_ext::{FollowSymlinks, OpenOptionsFollowExt};
let mut opts = cap_std::fs::OpenOptions::new();
if oflags.contains(OFlags::CREATE | OFlags::EXCLUSIVE) {
opts.create_new(true);
opts.write(true);
} else if oflags.contains(OFlags::CREATE) {
opts.create(true);
opts.write(true);
}
if oflags.contains(OFlags::TRUNCATE) {
opts.truncate(true);
}
if read {
opts.read(true);
}
if write {
opts.write(true);
} else {
// If not opened write, open read. This way the OS lets us open the file.
// If FileCaps::READ is not set, read calls will be rejected at the
// get_cap check.
opts.read(true);
}
if fdflags.contains(FdFlags::APPEND) {
opts.append(true);
}
if symlink_follow {
opts.follow(FollowSymlinks::Yes);
} else {
opts.follow(FollowSymlinks::No);
}
// the DSYNC, SYNC, and RSYNC flags are ignored! We do not
// have support for them in cap-std yet.
// ideally OpenOptions would just support this though:
// https://github.com/bytecodealliance/cap-std/issues/146
if fdflags.intersects(
wasi_common::file::FdFlags::DSYNC
| wasi_common::file::FdFlags::SYNC
| wasi_common::file::FdFlags::RSYNC,
) {
return Err(Error::not_supported().context("SYNC family of FdFlags"));
}
let mut f = self.0.open_with(Path::new(path), &opts)?;
// NONBLOCK does not have an OpenOption either, but we can patch that on with set_fd_flags:
if fdflags.contains(wasi_common::file::FdFlags::NONBLOCK) {
let set_fd_flags = f.new_set_fd_flags(system_interface::fs::FdFlags::NONBLOCK)?;
f.set_fd_flags(set_fd_flags)?;
}
Ok(File::from_cap_std(f))
}
Trait Implementations§
source§impl AsFd for File
impl AsFd for File
source§fn as_fd(&self) -> BorrowedFd<'_>
fn as_fd(&self) -> BorrowedFd<'_>
Borrows the file descriptor. Read more
source§impl WasiFile for File
impl WasiFile for File
fn as_any(&self) -> &dyn Any
fn pollable(&self) -> Option<BorrowedFd<'_>>
fn datasync<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn sync<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_filetype<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<FileType, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_fdflags<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<FdFlags, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn set_fdflags<'life0, 'async_trait>(
&'life0 mut self,
fdflags: FdFlags
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_filestat<'life0, 'async_trait>(
&'life0 mut self
) -> Pin<Box<dyn Future<Output = Result<Filestat, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn set_filestat_size<'life0, 'async_trait>(
&'life0 mut self,
size: u64
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn advise<'life0, 'async_trait>(
&'life0 mut self,
offset: u64,
len: u64,
advice: Advice
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn allocate<'life0, 'async_trait>(
&'life0 mut self,
offset: u64,
len: u64
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn set_times<'life0, 'async_trait>(
&'life0 mut self,
atime: Option<SystemTimeSpec>,
mtime: Option<SystemTimeSpec>
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn read_vectored<'a, 'life0, 'life1, 'async_trait>(
&'life0 mut self,
bufs: &'life1 mut [IoSliceMut<'a>]
) -> Pin<Box<dyn Future<Output = Result<u64, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn read_vectored_at<'a, 'life0, 'life1, 'async_trait>(
&'life0 mut self,
bufs: &'life1 mut [IoSliceMut<'a>],
offset: u64
) -> Pin<Box<dyn Future<Output = Result<u64, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn write_vectored<'a, 'life0, 'life1, 'async_trait>(
&'life0 mut self,
bufs: &'life1 [IoSlice<'a>]
) -> Pin<Box<dyn Future<Output = Result<u64, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn write_vectored_at<'a, 'life0, 'life1, 'async_trait>(
&'life0 mut self,
bufs: &'life1 [IoSlice<'a>],
offset: u64
) -> Pin<Box<dyn Future<Output = Result<u64, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn seek<'life0, 'async_trait>(
&'life0 mut self,
pos: SeekFrom
) -> Pin<Box<dyn Future<Output = Result<u64, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn peek<'life0, 'life1, 'async_trait>(
&'life0 mut self,
buf: &'life1 mut [u8]
) -> Pin<Box<dyn Future<Output = Result<u64, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn num_ready_bytes<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<u64, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn isatty(&mut self) -> bool
fn sock_accept<'life0, 'async_trait>(
&'life0 mut self,
_fdflags: FdFlags
) -> Pin<Box<dyn Future<Output = Result<Box<dyn WasiFile + 'static, Global>, Error>> + Send + 'async_trait, Global>>where
'life0: 'async_trait,
Self: 'async_trait,
fn sock_recv<'a, 'life0, 'life1, 'async_trait>(
&'life0 mut self,
_ri_data: &'life1 mut [IoSliceMut<'a>],
_ri_flags: RiFlags
) -> Pin<Box<dyn Future<Output = Result<(u64, RoFlags), Error>> + Send + 'async_trait, Global>>where
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn sock_send<'a, 'life0, 'life1, 'async_trait>(
&'life0 mut self,
_si_data: &'life1 [IoSlice<'a>],
_si_flags: SiFlags
) -> Pin<Box<dyn Future<Output = Result<u64, Error>> + Send + 'async_trait, Global>>where
'a: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn sock_shutdown<'life0, 'async_trait>(
&'life0 mut self,
_how: SdFlags
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait, Global>>where
'life0: 'async_trait,
Self: 'async_trait,
fn readable<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait, Global>>where
'life0: 'async_trait,
Self: 'async_trait,
fn writable<'life0, 'async_trait>(
&'life0 self
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait, Global>>where
'life0: 'async_trait,
Self: 'async_trait,
Auto Trait Implementations§
impl RefUnwindSafe for File
impl Send for File
impl Sync for File
impl Unpin for File
impl UnwindSafe for File
Blanket Implementations§
source§impl<T> AsFilelike for Twhere
T: AsFd,
impl<T> AsFilelike for Twhere
T: AsFd,
source§fn as_filelike(&self) -> BorrowedFd<'_>
fn as_filelike(&self) -> BorrowedFd<'_>
Borrows the reference. Read more
source§fn as_filelike_view<Target>(&self) -> FilelikeView<'_, Target>where
Target: FilelikeViewType,
fn as_filelike_view<Target>(&self) -> FilelikeView<'_, Target>where
Target: FilelikeViewType,
Return a borrowing view of a resource which dereferences to a
&Target
. Read more§impl<T> AsGrip for Twhere
T: AsFd,
impl<T> AsGrip for Twhere
T: AsFd,
§fn as_grip(&self) -> BorrowedFd<'_>
fn as_grip(&self) -> BorrowedFd<'_>
Extracts the grip.
source§impl<T> AsSocketlike for Twhere
T: AsFd,
impl<T> AsSocketlike for Twhere
T: AsFd,
source§fn as_socketlike(&self) -> BorrowedFd<'_>
fn as_socketlike(&self) -> BorrowedFd<'_>
Borrows the reference.
source§fn as_socketlike_view<Target>(&self) -> SocketlikeView<'_, Target>where
Target: SocketlikeViewType,
fn as_socketlike_view<Target>(&self) -> SocketlikeView<'_, Target>where
Target: SocketlikeViewType,
Return a borrowing view of a resource which dereferences to a
&Target
. Read moresource§impl<T> FileIoExt for Twhere
T: AsFilelike + IoExt,
impl<T> FileIoExt for Twhere
T: AsFilelike + IoExt,
source§fn advise(&self, offset: u64, len: u64, advice: Advice) -> Result<(), Error>
fn advise(&self, offset: u64, len: u64, advice: Advice) -> Result<(), Error>
Announce the expected access pattern of the data at the given offset.
source§fn allocate(&self, offset: u64, len: u64) -> Result<(), Error>
fn allocate(&self, offset: u64, len: u64) -> Result<(), Error>
Allocate space in the file, increasing the file size as needed, and
ensuring that there are no holes under the given range.
source§fn read_at(&self, buf: &mut [u8], offset: u64) -> Result<usize, Error>
fn read_at(&self, buf: &mut [u8], offset: u64) -> Result<usize, Error>
Reads a number of bytes starting from a given offset. Read more
source§fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> Result<(), Error>
fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> Result<(), Error>
Reads the exact number of byte required to fill buf from the given
offset. Read more
source§fn read_vectored_at(
&self,
bufs: &mut [IoSliceMut<'_>],
offset: u64
) -> Result<usize, Error>
fn read_vectored_at(
&self,
bufs: &mut [IoSliceMut<'_>],
offset: u64
) -> Result<usize, Error>
Is to
read_vectored
what read_at
is to read
.source§fn is_read_vectored_at(&self) -> bool
fn is_read_vectored_at(&self) -> bool
Determines if this
Read
er has an efficient read_vectored_at
implementation.source§fn read_to_end_at(
&self,
buf: &mut Vec<u8, Global>,
offset: u64
) -> Result<usize, Error>
fn read_to_end_at(
&self,
buf: &mut Vec<u8, Global>,
offset: u64
) -> Result<usize, Error>
Read all bytes, starting at
offset
, until EOF in this source, placing
them into buf
.source§fn read_to_string_at(&self, buf: &mut String, offset: u64) -> Result<usize, Error>
fn read_to_string_at(&self, buf: &mut String, offset: u64) -> Result<usize, Error>
Read all bytes, starting at
offset
, until EOF in this source,
appending them to buf
.source§fn write_at(&self, buf: &[u8], offset: u64) -> Result<usize, Error>
fn write_at(&self, buf: &[u8], offset: u64) -> Result<usize, Error>
Writes a number of bytes starting from a given offset. Read more
source§fn write_all_at(&self, buf: &[u8], offset: u64) -> Result<(), Error>
fn write_all_at(&self, buf: &[u8], offset: u64) -> Result<(), Error>
Attempts to write an entire buffer starting from a given offset. Read more
source§fn write_vectored_at(
&self,
bufs: &[IoSlice<'_>],
offset: u64
) -> Result<usize, Error>
fn write_vectored_at(
&self,
bufs: &[IoSlice<'_>],
offset: u64
) -> Result<usize, Error>
Is to
write_vectored
what write_at
is to write
.source§fn is_write_vectored_at(&self) -> bool
fn is_write_vectored_at(&self) -> bool
Determines if this
Write
r has an efficient write_vectored_at
implementation.source§fn seek(&self, pos: SeekFrom) -> Result<u64, Error>
fn seek(&self, pos: SeekFrom) -> Result<u64, Error>
Seek to an offset, in bytes, in a stream. Read more
source§fn stream_position(&self) -> Result<u64, Error>
fn stream_position(&self) -> Result<u64, Error>
Returns the current seek position from the start of the stream. Read more
source§fn read_exact_vectored_at(
&self,
bufs: &mut [IoSliceMut<'_>],
offset: u64
) -> Result<(), Error>
fn read_exact_vectored_at(
&self,
bufs: &mut [IoSliceMut<'_>],
offset: u64
) -> Result<(), Error>
Is to
read_exact_vectored
what read_exact_at
is to read_exact
.source§impl<T> GetSetFdFlags for T
impl<T> GetSetFdFlags for T
source§fn get_fd_flags(&self) -> Result<FdFlags, Error>where
T: AsFilelike,
fn get_fd_flags(&self) -> Result<FdFlags, Error>where
T: AsFilelike,
Query the “status” flags for the
self
file descriptor.source§fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>where
T: AsFilelike,
fn new_set_fd_flags(&self, fd_flags: FdFlags) -> Result<SetFdFlags<T>, Error>where
T: AsFilelike,
source§fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>where
T: AsFilelike,
fn set_fd_flags(&mut self, set_fd_flags: SetFdFlags<T>) -> Result<(), Error>where
T: AsFilelike,
Set the “status” flags for the
self
file descriptor. Read moresource§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IoExt for Twhere
T: AsFilelike + AsSocketlike,
impl<T> IoExt for Twhere
T: AsFilelike + AsSocketlike,
source§fn read(&self, buf: &mut [u8]) -> Result<usize, Error>
fn read(&self, buf: &mut [u8]) -> Result<usize, Error>
Pull some bytes from this source into the specified buffer, returning
how many bytes were read. Read more
source§fn read_exact(&self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&self, buf: &mut [u8]) -> Result<(), Error>
Read the exact number of bytes required to fill
buf
. Read moresource§fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
Like
read
, except that it reads into a slice of buffers. Read moresource§fn read_to_end(&self, buf: &mut Vec<u8, Global>) -> Result<usize, Error>
fn read_to_end(&self, buf: &mut Vec<u8, Global>) -> Result<usize, Error>
Read all bytes until EOF in this source, placing them into
buf
. Read moresource§fn read_to_string(&self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&self, buf: &mut String) -> Result<usize, Error>
Read all bytes until EOF in this source, appending them to
buf
. Read moresource§fn peek(&self, buf: &mut [u8]) -> Result<usize, Error>
fn peek(&self, buf: &mut [u8]) -> Result<usize, Error>
Read bytes from the current position without advancing the current
position. Read more
source§fn write(&self, buf: &[u8]) -> Result<usize, Error>
fn write(&self, buf: &[u8]) -> Result<usize, Error>
Write a buffer into this writer, returning how many bytes were written. Read more
source§fn write_all(&self, buf: &[u8]) -> Result<(), Error>
fn write_all(&self, buf: &[u8]) -> Result<(), Error>
Attempts to write an entire buffer into this writer. Read more
source§fn write_vectored(&self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>
fn write_vectored(&self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>
Like
write
, except that it writes from a slice of buffers. Read moresource§fn flush(&self) -> Result<(), Error>
fn flush(&self) -> Result<(), Error>
Flush this output stream, ensuring that all intermediately buffered
contents reach their destination. Read more
source§fn write_fmt(&self, fmt: Arguments<'_>) -> Result<(), Error>
fn write_fmt(&self, fmt: Arguments<'_>) -> Result<(), Error>
Writes a formatted string into this writer, returning any error
encountered. Read more
source§fn read_exact_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> Result<(), Error>
fn read_exact_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> Result<(), Error>
Is to
read_vectored
what read_exact
is to read
.source§impl<T> IsReadWrite for Twhere
T: AsFilelike,
impl<T> IsReadWrite for Twhere
T: AsFilelike,
source§impl<Stream> IsTerminal for Streamwhere
Stream: AsFilelike,
impl<Stream> IsTerminal for Streamwhere
Stream: AsFilelike,
source§fn is_terminal(&self) -> bool
fn is_terminal(&self) -> bool
Returns true if this is a terminal. Read more