wasmer_wasix/journal/effector/syscalls/
fd_write.rs1use 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}