wasmer_wasix/syscalls/wasix/
fd_fdflags_set.rs1use super::*;
2use crate::syscalls::*;
3
4#[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}