wasmer_wasix/syscalls/wasix/
fd_fdflags_set.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_fdflags_set(
13    mut ctx: FunctionEnvMut<'_, WasiEnv>,
14    fd: WasiFd,
15    flags: Fdflagsext,
16) -> Result<Errno, WasiError> {
17    WasiEnv::do_pending_operations(&mut ctx)?;
18
19    let ret = fd_fdflags_set_internal(&mut ctx, fd, flags)?;
20
21    if ret == Errno::Success {
22        #[cfg(feature = "journal")]
23        {
24            let env = ctx.data();
25            if env.enable_journal {
26                JournalEffector::save_fd_set_fdflags(&mut ctx, fd, flags).map_err(|err| {
27                    tracing::error!("failed to save file set fd flags event - {}", err);
28                    WasiError::Exit(ExitCode::from(Errno::Fault))
29                })?;
30            }
31        }
32    }
33
34    Ok(ret)
35}
36
37pub(crate) fn fd_fdflags_set_internal(
38    ctx: &mut FunctionEnvMut<'_, WasiEnv>,
39    fd: WasiFd,
40    flags: Fdflagsext,
41) -> Result<Errno, WasiError> {
42    let env = ctx.data();
43    let (_, mut state) = unsafe { env.get_memory_and_wasi_state(&ctx, 0) };
44    let mut fd_map = state.fs.fd_map.write().unwrap();
45    let mut fd_entry = wasi_try_ok!(fd_map.get_mut(fd).ok_or(Errno::Badf));
46    if !fd_entry.rights.contains(Rights::FD_FDSTAT_SET_FLAGS) {
47        return Ok(Errno::Access);
48    }
49    fd_entry.fd_flags = flags;
50    Ok(Errno::Success)
51}