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 let fd_entry = ctx.data().state.fs.get_fd(fd).map_err(|err| {
55 anyhow::format_err!("journal restore error: invalid descriptor (fd={fd}) - {err}")
56 })?;
57 fd_write_internal(
58 ctx,
59 fd,
60 fd_entry,
61 FdWriteSource::<'_, M>::Buffer(data),
62 offset,
63 true,
64 false,
65 )?
66 .map_err(|err| {
67 anyhow::format_err!(
68 "journal restore error: failed to write to descriptor (fd={fd}, offset={offset}) - {err}")
69 })?;
70 Ok(())
71 }
72}