wasmer_wasix/journal/effector/syscalls/
sock_send_to.rs

1use 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}