wasmer_wasix/journal/effector/syscalls/
fd_write.rs

1use super::*;
2
3impl JournalEffector {
4    pub fn save_fd_write<M: MemorySize>(
5        ctx: &FunctionEnvMut<'_, WasiEnv>,
6        fd: Fd,
7        mut offset: u64,
8        written: usize,
9        iovs: WasmPtr<__wasi_ciovec_t<M>, M>,
10        iovs_len: M::Offset,
11    ) -> anyhow::Result<()> {
12        let env = ctx.data();
13        let memory = unsafe { env.memory_view(&ctx) };
14        let iovs_arr = iovs.slice(&memory, iovs_len)?;
15
16        let iovs_arr = iovs_arr.access().map_err(mem_error_to_wasi)?;
17        let mut remaining: M::Offset = TryFrom::<usize>::try_from(written).unwrap_or_default();
18        for iovs in iovs_arr.iter() {
19            let sub = iovs.buf_len.min(remaining);
20            if sub == M::ZERO {
21                continue;
22            }
23            remaining -= sub;
24
25            let buf = WasmPtr::<u8, M>::new(iovs.buf)
26                .slice(&memory, sub)
27                .map_err(mem_error_to_wasi)?
28                .access()
29                .map_err(mem_error_to_wasi)?;
30            let data = Cow::Borrowed(buf.as_ref());
31            let data_len = data.len();
32
33            ctx.data()
34                .active_journal()?
35                .write(JournalEntry::FileDescriptorWriteV1 {
36                    fd,
37                    offset,
38                    data,
39                    is_64bit: M::is_64bit(),
40                })
41                .map_err(map_snapshot_err)?;
42
43            offset += data_len as u64;
44        }
45        Ok(())
46    }
47
48    pub fn apply_fd_write<M: MemorySize>(
49        ctx: &mut FunctionEnvMut<'_, WasiEnv>,
50        fd: Fd,
51        offset: u64,
52        data: Cow<'_, [u8]>,
53    ) -> anyhow::Result<()> {
54        fd_write_internal(
55            ctx,
56            fd,
57            FdWriteSource::<'_, M>::Buffer(data),
58            offset,
59            true,
60            false,
61        )?
62        .map_err(|err| {
63            anyhow::format_err!(
64                "journal restore error: failed to write to descriptor (fd={fd}, offset={offset}) - {err}")
65        })?;
66        Ok(())
67    }
68}