wasmer_wasix/journal/effector/syscalls/
sock_send_to.rs1use std::net::SocketAddr;
2use wasmer_wasix_types::wasi::SiFlags;
3
4use crate::syscalls::sock_send_to_internal;
5
6use super::*;
7
8impl JournalEffector {
9 pub fn save_sock_send_to<M: MemorySize>(
10 ctx: &FunctionEnvMut<'_, WasiEnv>,
11 fd: Fd,
12 sent: usize,
13 iovs: WasmPtr<__wasi_ciovec_t<M>, M>,
14 iovs_len: M::Offset,
15 addr: SocketAddr,
16 si_flags: SiFlags,
17 ) -> anyhow::Result<()> {
18 let env = ctx.data();
19 let memory = unsafe { env.memory_view(&ctx) };
20 let iovs_arr = iovs.slice(&memory, iovs_len)?;
21
22 let iovs_arr = iovs_arr.access().map_err(mem_error_to_wasi)?;
23 let mut remaining: M::Offset = TryFrom::<usize>::try_from(sent).unwrap_or_default();
24 for iovs in iovs_arr.iter() {
25 let sub = iovs.buf_len.min(remaining);
26 if sub == M::ZERO {
27 continue;
28 }
29 remaining -= sub;
30
31 let buf = WasmPtr::<u8, M>::new(iovs.buf)
32 .slice(&memory, sub)
33 .map_err(mem_error_to_wasi)?
34 .access()
35 .map_err(mem_error_to_wasi)?;
36 ctx.data()
37 .active_journal()?
38 .write(JournalEntry::SocketSendToV1 {
39 fd,
40 data: Cow::Borrowed(buf.as_ref()),
41 addr,
42 is_64bit: M::is_64bit(),
43 flags: si_flags,
44 })
45 .map_err(map_snapshot_err)?;
46 }
47 Ok(())
48 }
49
50 pub fn apply_sock_send_to<M: MemorySize>(
51 ctx: &mut FunctionEnvMut<'_, WasiEnv>,
52 sock: Fd,
53 si_data: Cow<'_, [u8]>,
54 si_flags: SiFlags,
55 addr: SocketAddr,
56 ) -> anyhow::Result<()> {
57 let data_len = si_data.len();
58 sock_send_to_internal::<M>(
59 ctx,
60 sock,
61 FdWriteSource::<'_, M>::Buffer(si_data),
62 si_flags,
63 addr,
64 )?
65 .map_err(|err| {
66 anyhow::format_err!(
67 "journal restore error: failed to send_to on socket (fd={sock}, data.len={data_len}) - {err}")
68 })?;
69 Ok(())
70 }
71}