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