}
impl VisitTags for FileHandler {
- fn visit_tags(&self, _visit: &mut dyn FnMut(SbTag)) {
+ fn visit_tags(&self, _visit: &mut dyn FnMut(BorTag)) {
// All our FileDescriptor do not have any tags.
}
}
}
impl VisitTags for DirHandler {
- fn visit_tags(&self, visit: &mut dyn FnMut(SbTag)) {
+ fn visit_tags(&self, visit: &mut dyn FnMut(BorTag)) {
let DirHandler { streams, next_id: _ } = self;
for dir in streams.values() {
let mut mirror = access_mode;
let o_append = this.eval_libc_i32("O_APPEND")?;
- if flag & o_append != 0 {
+ if flag & o_append == o_append {
options.append(true);
mirror |= o_append;
}
let o_trunc = this.eval_libc_i32("O_TRUNC")?;
- if flag & o_trunc != 0 {
+ if flag & o_trunc == o_trunc {
options.truncate(true);
mirror |= o_trunc;
}
let o_creat = this.eval_libc_i32("O_CREAT")?;
- if flag & o_creat != 0 {
+ if flag & o_creat == o_creat {
// Get the mode. On macOS, the argument type `mode_t` is actually `u16`, but
// C integer promotion rules mean that on the ABI level, it gets passed as `u32`
// (see https://github.com/rust-lang/rust/issues/71915).
mirror |= o_creat;
let o_excl = this.eval_libc_i32("O_EXCL")?;
- if flag & o_excl != 0 {
+ if flag & o_excl == o_excl {
mirror |= o_excl;
options.create_new(true);
} else {
}
}
let o_cloexec = this.eval_libc_i32("O_CLOEXEC")?;
- if flag & o_cloexec != 0 {
+ if flag & o_cloexec == o_cloexec {
// We do not need to do anything for this flag because `std` already sets it.
// (Technically we do not support *not* setting this flag, but we ignore that.)
mirror |= o_cloexec;
}
+ if this.tcx.sess.target.os == "linux" {
+ let o_tmpfile = this.eval_libc_i32("O_TMPFILE")?;
+ if flag & o_tmpfile == o_tmpfile {
+ // if the flag contains `O_TMPFILE` then we return a graceful error
+ let eopnotsupp = this.eval_libc("EOPNOTSUPP")?;
+ this.set_last_error(eopnotsupp)?;
+ return Ok(-1);
+ }
+ }
// If `flag` is not equal to `mirror`, there is an unsupported option enabled in `flag`,
// then we throw an error.
if flag != mirror {
let path = this.read_path_from_c_str(pathname_ptr)?.into_owned();
// See <https://github.com/rust-lang/rust/pull/79196> for a discussion of argument sizes.
- let empty_path_flag = flags & this.eval_libc("AT_EMPTY_PATH")?.to_i32()? != 0;
+ let at_ampty_path = this.eval_libc_i32("AT_EMPTY_PATH")?;
+ let empty_path_flag = flags & at_ampty_path == at_ampty_path;
// We only support:
// * interpreting `path` as an absolute directory,
// * interpreting `path` as a path relative to `dirfd` when the latter is `AT_FDCWD`, or
}
impl FileMetadata {
- fn from_path<'tcx, 'mir>(
- ecx: &mut MiriInterpCx<'mir, 'tcx>,
+ fn from_path<'tcx>(
+ ecx: &mut MiriInterpCx<'_, 'tcx>,
path: &Path,
follow_symlink: bool,
) -> InterpResult<'tcx, Option<FileMetadata>> {
FileMetadata::from_meta(ecx, metadata)
}
- fn from_fd<'tcx, 'mir>(
- ecx: &mut MiriInterpCx<'mir, 'tcx>,
+ fn from_fd<'tcx>(
+ ecx: &mut MiriInterpCx<'_, 'tcx>,
fd: i32,
) -> InterpResult<'tcx, Option<FileMetadata>> {
let option = ecx.machine.file_handler.handles.get(&fd);
FileMetadata::from_meta(ecx, metadata)
}
- fn from_meta<'tcx, 'mir>(
- ecx: &mut MiriInterpCx<'mir, 'tcx>,
+ fn from_meta<'tcx>(
+ ecx: &mut MiriInterpCx<'_, 'tcx>,
metadata: Result<std::fs::Metadata, std::io::Error>,
) -> InterpResult<'tcx, Option<FileMetadata>> {
let metadata = match metadata {