wasmer_wasix/syscalls/wasi/
fd_fdstat_set_flags.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `fd_fdstat_set_flags()`
5/// Set file descriptor flags for a file descriptor
6/// Inputs:
7/// - `Fd fd`
8///     The file descriptor to apply the new flags to
9/// - `Fdflags flags`
10///     The flags to apply to `fd`
11#[instrument(level = "trace", skip_all, fields(%fd), ret)]
12pub fn fd_fdstat_set_flags(
13    mut ctx: FunctionEnvMut<'_, WasiEnv>,
14    fd: WasiFd,
15    flags: Fdflags,
16) -> Result<Errno, WasiError> {
17    WasiEnv::do_pending_operations(&mut ctx)?;
18
19    let ret = fd_fdstat_set_flags_internal(&mut ctx, fd, flags)?;
20    let env = ctx.data();
21
22    if ret == Errno::Success {
23        #[cfg(feature = "journal")]
24        if env.enable_journal {
25            JournalEffector::save_fd_set_flags(&mut ctx, fd, flags).map_err(|err| {
26                tracing::error!("failed to save file set flags event - {}", err);
27                WasiError::Exit(ExitCode::from(Errno::Fault))
28            })?;
29        }
30    }
31
32    Ok(ret)
33}
34
35pub(crate) fn fd_fdstat_set_flags_internal(
36    ctx: &mut FunctionEnvMut<'_, WasiEnv>,
37    fd: WasiFd,
38    flags: Fdflags,
39) -> Result<Errno, WasiError> {
40    {
41        let env = ctx.data();
42        let (_, mut state, inodes) = unsafe { env.get_memory_and_wasi_state_and_inodes(&ctx, 0) };
43        let fd_map = state.fs.fd_map.read().unwrap();
44        let fd_entry = wasi_try_ok!(fd_map.get(fd).ok_or(Errno::Badf));
45
46        if !fd_entry.inner.rights.contains(Rights::FD_FDSTAT_SET_FLAGS) {
47            return Ok(Errno::Access);
48        }
49    }
50
51    let env = ctx.data();
52    let (_, mut state, inodes) = unsafe { env.get_memory_and_wasi_state_and_inodes(&ctx, 0) };
53    let mut fd_map = state.fs.fd_map.write().unwrap();
54    let mut fd_entry = wasi_try_ok!(fd_map.get_mut(fd).ok_or(Errno::Badf));
55    fd_entry.flags = flags;
56    Ok(Errno::Success)
57}