wasi-common: wiggle flags are now bitflags!
this mostly mechanical change is just getting rid of passing to `contains` by reference.
This commit is contained in:
@@ -78,7 +78,7 @@ impl Entry {
|
||||
/// `HandleRights` structure is a subset of rights attached to this `Entry`. The check is
|
||||
/// performed using `Entry::validate_rights` method. If the check fails, `Error::Notcapable`
|
||||
/// is returned.
|
||||
pub(crate) fn as_handle(&self, rights: &HandleRights) -> Result<EntryHandle> {
|
||||
pub(crate) fn as_handle(&self, rights: HandleRights) -> Result<EntryHandle> {
|
||||
self.validate_rights(rights)?;
|
||||
Ok(self.handle.get())
|
||||
}
|
||||
@@ -87,7 +87,7 @@ impl Entry {
|
||||
/// rights attached to this `Entry` object are a superset.
|
||||
///
|
||||
/// Upon unsuccessful check, `Error::Notcapable` is returned.
|
||||
pub(crate) fn validate_rights(&self, rights: &HandleRights) -> Result<()> {
|
||||
pub(crate) fn validate_rights(&self, rights: HandleRights) -> Result<()> {
|
||||
let this_rights = self.handle.get_rights();
|
||||
if this_rights.contains(rights) {
|
||||
Ok(())
|
||||
|
||||
@@ -39,8 +39,8 @@ impl HandleRights {
|
||||
}
|
||||
|
||||
/// Checks if `other` is a subset of those rights.
|
||||
pub fn contains(&self, other: &Self) -> bool {
|
||||
self.base.contains(&other.base) && self.inheriting.contains(&other.inheriting)
|
||||
pub fn contains(&self, other: Self) -> bool {
|
||||
self.base.contains(other.base) && self.inheriting.contains(other.inheriting)
|
||||
}
|
||||
|
||||
/// Returns base rights.
|
||||
@@ -100,7 +100,7 @@ pub trait Handle {
|
||||
let file_type = self.get_file_type();
|
||||
let rights = self.get_rights();
|
||||
let required_rights = HandleRights::from_base(Rights::FD_SEEK | Rights::FD_TELL);
|
||||
file_type == Filetype::CharacterDevice && rights.contains(&required_rights)
|
||||
file_type == Filetype::CharacterDevice && rights.contains(required_rights)
|
||||
}
|
||||
// TODO perhaps should be a separate trait?
|
||||
// FdOps
|
||||
|
||||
@@ -11,7 +11,7 @@ pub(crate) use crate::sys::path::{from_host, open_rights};
|
||||
/// This is a workaround for not having Capsicum support in the OS.
|
||||
pub(crate) fn get(
|
||||
entry: &Entry,
|
||||
required_rights: &HandleRights,
|
||||
required_rights: HandleRights,
|
||||
dirflags: Lookupflags,
|
||||
path: &str,
|
||||
needs_final_component: bool,
|
||||
@@ -140,7 +140,7 @@ pub(crate) fn get(
|
||||
}
|
||||
|
||||
continue;
|
||||
} else if ends_with_slash || dirflags.contains(&Lookupflags::SYMLINK_FOLLOW)
|
||||
} else if ends_with_slash || dirflags.contains(Lookupflags::SYMLINK_FOLLOW)
|
||||
{
|
||||
// if there's a trailing slash, or if `LOOKUP_SYMLINK_FOLLOW` is set, attempt
|
||||
// symlink expansion
|
||||
|
||||
@@ -60,7 +60,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let required_rights = HandleRights::from_base(types::Rights::FD_ADVISE);
|
||||
let entry = self.get_entry(fd)?;
|
||||
entry
|
||||
.as_handle(&required_rights)?
|
||||
.as_handle(required_rights)?
|
||||
.advise(advice, offset, len)
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
) -> Result<()> {
|
||||
let required_rights = HandleRights::from_base(types::Rights::FD_ALLOCATE);
|
||||
let entry = self.get_entry(fd)?;
|
||||
entry.as_handle(&required_rights)?.allocate(offset, len)
|
||||
entry.as_handle(required_rights)?.allocate(offset, len)
|
||||
}
|
||||
|
||||
fn fd_close(&self, fd: types::Fd) -> Result<()> {
|
||||
@@ -89,12 +89,12 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
fn fd_datasync(&self, fd: types::Fd) -> Result<()> {
|
||||
let required_rights = HandleRights::from_base(types::Rights::FD_DATASYNC);
|
||||
let entry = self.get_entry(fd)?;
|
||||
entry.as_handle(&required_rights)?.datasync()
|
||||
entry.as_handle(required_rights)?.datasync()
|
||||
}
|
||||
|
||||
fn fd_fdstat_get(&self, fd: types::Fd) -> Result<types::Fdstat> {
|
||||
let entry = self.get_entry(fd)?;
|
||||
let file = entry.as_handle(&HandleRights::empty())?;
|
||||
let file = entry.as_handle(HandleRights::empty())?;
|
||||
let fs_flags = file.fdstat_get()?;
|
||||
let rights = entry.get_rights();
|
||||
let fdstat = types::Fdstat {
|
||||
@@ -109,7 +109,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
fn fd_fdstat_set_flags(&self, fd: types::Fd, flags: types::Fdflags) -> Result<()> {
|
||||
let required_rights = HandleRights::from_base(types::Rights::FD_FDSTAT_SET_FLAGS);
|
||||
let entry = self.get_entry(fd)?;
|
||||
entry.as_handle(&required_rights)?.fdstat_set_flags(flags)
|
||||
entry.as_handle(required_rights)?.fdstat_set_flags(flags)
|
||||
}
|
||||
|
||||
fn fd_fdstat_set_rights(
|
||||
@@ -120,7 +120,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
) -> Result<()> {
|
||||
let rights = HandleRights::new(fs_rights_base, fs_rights_inheriting);
|
||||
let entry = self.get_entry(fd)?;
|
||||
if !entry.get_rights().contains(&rights) {
|
||||
if !entry.get_rights().contains(rights) {
|
||||
return Err(Error::Notcapable);
|
||||
}
|
||||
entry.set_rights(rights);
|
||||
@@ -130,14 +130,14 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
fn fd_filestat_get(&self, fd: types::Fd) -> Result<types::Filestat> {
|
||||
let required_rights = HandleRights::from_base(types::Rights::FD_FILESTAT_GET);
|
||||
let entry = self.get_entry(fd)?;
|
||||
let host_filestat = entry.as_handle(&required_rights)?.filestat_get()?;
|
||||
let host_filestat = entry.as_handle(required_rights)?.filestat_get()?;
|
||||
Ok(host_filestat)
|
||||
}
|
||||
|
||||
fn fd_filestat_set_size(&self, fd: types::Fd, size: types::Filesize) -> Result<()> {
|
||||
let required_rights = HandleRights::from_base(types::Rights::FD_FILESTAT_SET_SIZE);
|
||||
let entry = self.get_entry(fd)?;
|
||||
entry.as_handle(&required_rights)?.filestat_set_size(size)
|
||||
entry.as_handle(required_rights)?.filestat_set_size(size)
|
||||
}
|
||||
|
||||
fn fd_filestat_set_times(
|
||||
@@ -150,7 +150,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let required_rights = HandleRights::from_base(types::Rights::FD_FILESTAT_SET_TIMES);
|
||||
let entry = self.get_entry(fd)?;
|
||||
entry
|
||||
.as_handle(&required_rights)?
|
||||
.as_handle(required_rights)?
|
||||
.filestat_set_times(atim, mtim, fst_flags)
|
||||
}
|
||||
|
||||
@@ -180,7 +180,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
.map(|s| io::IoSliceMut::new(&mut *s))
|
||||
.collect::<Vec<io::IoSliceMut<'_>>>();
|
||||
entry
|
||||
.as_handle(&required_rights)?
|
||||
.as_handle(required_rights)?
|
||||
.preadv(&mut buf, offset)?
|
||||
.try_into()?
|
||||
};
|
||||
@@ -255,7 +255,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let buf: Vec<io::IoSlice> =
|
||||
guest_slices.iter().map(|s| io::IoSlice::new(&*s)).collect();
|
||||
entry
|
||||
.as_handle(&required_rights)?
|
||||
.as_handle(required_rights)?
|
||||
.pwritev(&buf, offset)?
|
||||
.try_into()?
|
||||
};
|
||||
@@ -278,7 +278,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
.map(|s| io::IoSliceMut::new(&mut *s))
|
||||
.collect();
|
||||
entry
|
||||
.as_handle(&required_rights)?
|
||||
.as_handle(required_rights)?
|
||||
.read_vectored(&mut slices)?
|
||||
.try_into()?
|
||||
};
|
||||
@@ -298,7 +298,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
|
||||
let mut bufused = 0;
|
||||
let mut buf = buf.clone();
|
||||
for pair in entry.as_handle(&required_rights)?.readdir(cookie)? {
|
||||
for pair in entry.as_handle(required_rights)?.readdir(cookie)? {
|
||||
let (dirent, name) = pair?;
|
||||
let dirent_raw = dirent.as_bytes()?;
|
||||
let dirent_len: types::Size = dirent_raw.len().try_into()?;
|
||||
@@ -379,21 +379,21 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
types::Whence::End => SeekFrom::End(offset),
|
||||
types::Whence::Set => SeekFrom::Start(offset as u64),
|
||||
};
|
||||
let host_newoffset = entry.as_handle(&required_rights)?.seek(pos)?;
|
||||
let host_newoffset = entry.as_handle(required_rights)?.seek(pos)?;
|
||||
Ok(host_newoffset)
|
||||
}
|
||||
|
||||
fn fd_sync(&self, fd: types::Fd) -> Result<()> {
|
||||
let required_rights = HandleRights::from_base(types::Rights::FD_SYNC);
|
||||
let entry = self.get_entry(fd)?;
|
||||
entry.as_handle(&required_rights)?.sync()
|
||||
entry.as_handle(required_rights)?.sync()
|
||||
}
|
||||
|
||||
fn fd_tell(&self, fd: types::Fd) -> Result<types::Filesize> {
|
||||
let required_rights = HandleRights::from_base(types::Rights::FD_TELL);
|
||||
let entry = self.get_entry(fd)?;
|
||||
let host_offset = entry
|
||||
.as_handle(&required_rights)?
|
||||
.as_handle(required_rights)?
|
||||
.seek(SeekFrom::Current(0))?;
|
||||
Ok(host_offset)
|
||||
}
|
||||
@@ -411,7 +411,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let slices: Vec<io::IoSlice> =
|
||||
guest_slices.iter().map(|s| io::IoSlice::new(&*s)).collect();
|
||||
entry
|
||||
.as_handle(&required_rights)?
|
||||
.as_handle(required_rights)?
|
||||
.write_vectored(&slices)?
|
||||
.try_into()?
|
||||
};
|
||||
@@ -426,7 +426,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let path = path.as_str()?;
|
||||
let (dirfd, path) = path::get(
|
||||
&entry,
|
||||
&required_rights,
|
||||
required_rights,
|
||||
types::Lookupflags::empty(),
|
||||
path.deref(),
|
||||
false,
|
||||
@@ -443,9 +443,9 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let required_rights = HandleRights::from_base(types::Rights::PATH_FILESTAT_GET);
|
||||
let entry = self.get_entry(dirfd)?;
|
||||
let path = path.as_str()?;
|
||||
let (dirfd, path) = path::get(&entry, &required_rights, flags, path.deref(), false)?;
|
||||
let (dirfd, path) = path::get(&entry, required_rights, flags, path.deref(), false)?;
|
||||
let host_filestat =
|
||||
dirfd.filestat_get_at(&path, flags.contains(&types::Lookupflags::SYMLINK_FOLLOW))?;
|
||||
dirfd.filestat_get_at(&path, flags.contains(types::Lookupflags::SYMLINK_FOLLOW))?;
|
||||
Ok(host_filestat)
|
||||
}
|
||||
|
||||
@@ -461,13 +461,13 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let required_rights = HandleRights::from_base(types::Rights::PATH_FILESTAT_SET_TIMES);
|
||||
let entry = self.get_entry(dirfd)?;
|
||||
let path = path.as_str()?;
|
||||
let (dirfd, path) = path::get(&entry, &required_rights, flags, path.deref(), false)?;
|
||||
let (dirfd, path) = path::get(&entry, required_rights, flags, path.deref(), false)?;
|
||||
dirfd.filestat_set_times_at(
|
||||
&path,
|
||||
atim,
|
||||
mtim,
|
||||
fst_flags,
|
||||
flags.contains(&types::Lookupflags::SYMLINK_FOLLOW),
|
||||
flags.contains(types::Lookupflags::SYMLINK_FOLLOW),
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -487,7 +487,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let old_path = old_path.as_str()?;
|
||||
path::get(
|
||||
&old_entry,
|
||||
&required_rights,
|
||||
required_rights,
|
||||
types::Lookupflags::empty(),
|
||||
old_path.deref(),
|
||||
false,
|
||||
@@ -500,7 +500,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let new_path = new_path.as_str()?;
|
||||
path::get(
|
||||
&new_entry,
|
||||
&required_rights,
|
||||
required_rights,
|
||||
types::Lookupflags::empty(),
|
||||
new_path.deref(),
|
||||
false,
|
||||
@@ -510,7 +510,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
&old_path,
|
||||
new_dirfd,
|
||||
&new_path,
|
||||
old_flags.contains(&types::Lookupflags::SYMLINK_FOLLOW),
|
||||
old_flags.contains(types::Lookupflags::SYMLINK_FOLLOW),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -535,7 +535,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let path = path.as_str()?;
|
||||
path::get(
|
||||
&entry,
|
||||
&needed_rights,
|
||||
needed_rights,
|
||||
dirflags,
|
||||
path.deref(),
|
||||
oflags & types::Oflags::CREAT != types::Oflags::empty(),
|
||||
@@ -581,7 +581,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let path = path.as_str()?;
|
||||
path::get(
|
||||
&entry,
|
||||
&required_rights,
|
||||
required_rights,
|
||||
types::Lookupflags::empty(),
|
||||
path.deref(),
|
||||
false,
|
||||
@@ -599,7 +599,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let path = path.as_str()?;
|
||||
path::get(
|
||||
&entry,
|
||||
&required_rights,
|
||||
required_rights,
|
||||
types::Lookupflags::empty(),
|
||||
path.deref(),
|
||||
true,
|
||||
@@ -621,7 +621,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let old_path = old_path.as_str()?;
|
||||
path::get(
|
||||
&entry,
|
||||
&required_rights,
|
||||
required_rights,
|
||||
types::Lookupflags::empty(),
|
||||
old_path.deref(),
|
||||
true,
|
||||
@@ -633,7 +633,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let new_path = new_path.as_str()?;
|
||||
path::get(
|
||||
&entry,
|
||||
&required_rights,
|
||||
required_rights,
|
||||
types::Lookupflags::empty(),
|
||||
new_path.deref(),
|
||||
true,
|
||||
@@ -654,7 +654,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let new_path = new_path.as_str()?;
|
||||
path::get(
|
||||
&entry,
|
||||
&required_rights,
|
||||
required_rights,
|
||||
types::Lookupflags::empty(),
|
||||
new_path.deref(),
|
||||
true,
|
||||
@@ -672,7 +672,7 @@ impl<'a> WasiSnapshotPreview1 for WasiCtx {
|
||||
let path = path.as_str()?;
|
||||
path::get(
|
||||
&entry,
|
||||
&required_rights,
|
||||
required_rights,
|
||||
types::Lookupflags::empty(),
|
||||
path.deref(),
|
||||
false,
|
||||
@@ -815,7 +815,7 @@ impl WasiCtx {
|
||||
}
|
||||
};
|
||||
fd_events.push(sched::FdEventData {
|
||||
handle: entry.as_handle(&required_rights)?,
|
||||
handle: entry.as_handle(required_rights)?,
|
||||
r#type: types::Eventtype::FdRead,
|
||||
userdata: subscription.userdata,
|
||||
});
|
||||
@@ -841,7 +841,7 @@ impl WasiCtx {
|
||||
}
|
||||
};
|
||||
fd_events.push(sched::FdEventData {
|
||||
handle: entry.as_handle(&required_rights)?,
|
||||
handle: entry.as_handle(required_rights)?,
|
||||
r#type: types::Eventtype::FdWrite,
|
||||
userdata: subscription.userdata,
|
||||
});
|
||||
|
||||
@@ -12,10 +12,10 @@ pub(crate) fn filestat_set_times(
|
||||
st_mtim: Timestamp,
|
||||
fst_flags: Fstflags,
|
||||
) -> Result<()> {
|
||||
let set_atim = fst_flags.contains(&Fstflags::ATIM);
|
||||
let set_atim_now = fst_flags.contains(&Fstflags::ATIM_NOW);
|
||||
let set_mtim = fst_flags.contains(&Fstflags::MTIM);
|
||||
let set_mtim_now = fst_flags.contains(&Fstflags::MTIM_NOW);
|
||||
let set_atim = fst_flags.contains(Fstflags::ATIM);
|
||||
let set_atim_now = fst_flags.contains(Fstflags::ATIM_NOW);
|
||||
let set_mtim = fst_flags.contains(Fstflags::MTIM);
|
||||
let set_mtim_now = fst_flags.contains(Fstflags::MTIM_NOW);
|
||||
|
||||
if (set_atim && set_atim_now) || (set_mtim && set_mtim_now) {
|
||||
return Err(Error::Inval);
|
||||
|
||||
@@ -147,19 +147,19 @@ impl From<Clockid> for ClockId {
|
||||
impl From<Fdflags> for OFlags {
|
||||
fn from(fdflags: Fdflags) -> Self {
|
||||
let mut nix_flags = Self::empty();
|
||||
if fdflags.contains(&Fdflags::APPEND) {
|
||||
if fdflags.contains(Fdflags::APPEND) {
|
||||
nix_flags.insert(Self::APPEND);
|
||||
}
|
||||
if fdflags.contains(&Fdflags::DSYNC) {
|
||||
if fdflags.contains(Fdflags::DSYNC) {
|
||||
nix_flags.insert(Self::DSYNC);
|
||||
}
|
||||
if fdflags.contains(&Fdflags::NONBLOCK) {
|
||||
if fdflags.contains(Fdflags::NONBLOCK) {
|
||||
nix_flags.insert(Self::NONBLOCK);
|
||||
}
|
||||
if fdflags.contains(&Fdflags::RSYNC) {
|
||||
if fdflags.contains(Fdflags::RSYNC) {
|
||||
nix_flags.insert(O_RSYNC);
|
||||
}
|
||||
if fdflags.contains(&Fdflags::SYNC) {
|
||||
if fdflags.contains(Fdflags::SYNC) {
|
||||
nix_flags.insert(Self::SYNC);
|
||||
}
|
||||
nix_flags
|
||||
@@ -191,16 +191,16 @@ impl From<OFlags> for Fdflags {
|
||||
impl From<Oflags> for OFlags {
|
||||
fn from(oflags: Oflags) -> Self {
|
||||
let mut nix_flags = Self::empty();
|
||||
if oflags.contains(&Oflags::CREAT) {
|
||||
if oflags.contains(Oflags::CREAT) {
|
||||
nix_flags.insert(Self::CREAT);
|
||||
}
|
||||
if oflags.contains(&Oflags::DIRECTORY) {
|
||||
if oflags.contains(Oflags::DIRECTORY) {
|
||||
nix_flags.insert(Self::DIRECTORY);
|
||||
}
|
||||
if oflags.contains(&Oflags::EXCL) {
|
||||
if oflags.contains(Oflags::EXCL) {
|
||||
nix_flags.insert(Self::EXCL);
|
||||
}
|
||||
if oflags.contains(&Oflags::TRUNC) {
|
||||
if oflags.contains(Oflags::TRUNC) {
|
||||
nix_flags.insert(Self::TRUNC);
|
||||
}
|
||||
nix_flags
|
||||
|
||||
@@ -239,10 +239,10 @@ pub(crate) fn filestat_set_times_at(
|
||||
use std::time::{Duration, UNIX_EPOCH};
|
||||
use yanix::filetime::*;
|
||||
|
||||
let set_atim = fst_flags.contains(&Fstflags::ATIM);
|
||||
let set_atim_now = fst_flags.contains(&Fstflags::ATIM_NOW);
|
||||
let set_mtim = fst_flags.contains(&Fstflags::MTIM);
|
||||
let set_mtim_now = fst_flags.contains(&Fstflags::MTIM_NOW);
|
||||
let set_atim = fst_flags.contains(Fstflags::ATIM);
|
||||
let set_atim_now = fst_flags.contains(Fstflags::ATIM_NOW);
|
||||
let set_mtim = fst_flags.contains(Fstflags::MTIM);
|
||||
let set_mtim_now = fst_flags.contains(Fstflags::MTIM_NOW);
|
||||
|
||||
if (set_atim && set_atim_now) || (set_mtim && set_mtim_now) {
|
||||
return Err(Error::Inval);
|
||||
|
||||
@@ -299,7 +299,7 @@ impl Handle for InMemoryFile {
|
||||
trace!("write_vectored(iovs={:?})", iovs);
|
||||
let mut data = self.data.borrow_mut();
|
||||
|
||||
let append_mode = self.fd_flags.get().contains(&Fdflags::APPEND);
|
||||
let append_mode = self.fd_flags.get().contains(Fdflags::APPEND);
|
||||
trace!(" | fd_flags={}", self.fd_flags.get());
|
||||
|
||||
// If this file is in append mode, we write to the end.
|
||||
@@ -353,7 +353,7 @@ impl Handle for InMemoryFile {
|
||||
oflags: Oflags,
|
||||
_fd_flags: Fdflags,
|
||||
) -> Result<Box<dyn Handle>> {
|
||||
if oflags.contains(&Oflags::DIRECTORY) {
|
||||
if oflags.contains(Oflags::DIRECTORY) {
|
||||
tracing::trace!(
|
||||
"InMemoryFile::openat was passed oflags DIRECTORY, but {:?} is a file.",
|
||||
path
|
||||
@@ -652,7 +652,7 @@ impl Handle for VirtualDir {
|
||||
return Err(Error::Exist);
|
||||
}
|
||||
|
||||
if oflags.contains(&Oflags::DIRECTORY)
|
||||
if oflags.contains(Oflags::DIRECTORY)
|
||||
&& e.get().get_file_type() != Filetype::Directory
|
||||
{
|
||||
tracing::trace!(
|
||||
@@ -665,7 +665,7 @@ impl Handle for VirtualDir {
|
||||
e.get().try_clone().map_err(Into::into)
|
||||
}
|
||||
Entry::Vacant(v) => {
|
||||
if oflags.contains(&Oflags::CREAT) {
|
||||
if oflags.contains(Oflags::CREAT) {
|
||||
if self.writable {
|
||||
// Enforce a hard limit at `u32::MAX - 2` files.
|
||||
// This is to have a constant limit (rather than target-dependent limit we
|
||||
|
||||
Reference in New Issue
Block a user