wasmer_wasix/syscalls/wasix/
sock_join_multicast_v6.rs1use super::*;
2use crate::syscalls::*;
3
4#[instrument(level = "trace", skip_all, fields(%sock, %iface), ret)]
13pub fn sock_join_multicast_v6<M: MemorySize>(
14 mut ctx: FunctionEnvMut<'_, WasiEnv>,
15 sock: WasiFd,
16 multiaddr: WasmPtr<__wasi_addr_ip6_t, M>,
17 iface: u32,
18) -> Result<Errno, WasiError> {
19 WasiEnv::do_pending_operations(&mut ctx)?;
20
21 let env = ctx.data();
22 let memory = unsafe { env.memory_view(&ctx) };
23 let multiaddr = wasi_try_ok!(crate::net::read_ip_v6(&memory, multiaddr));
24
25 wasi_try_ok!(sock_join_multicast_v6_internal(
26 &mut ctx, sock, multiaddr, iface
27 )?);
28
29 #[cfg(feature = "journal")]
30 if ctx.data().enable_journal {
31 JournalEffector::save_sock_join_ipv6_multicast(&mut ctx, sock, multiaddr, iface).map_err(
32 |err| {
33 tracing::error!("failed to save sock_join_ipv6_multicast event - {}", err);
34 WasiError::Exit(ExitCode::from(Errno::Fault))
35 },
36 )?;
37 }
38
39 Ok(Errno::Success)
40}
41
42pub(crate) fn sock_join_multicast_v6_internal(
43 ctx: &mut FunctionEnvMut<'_, WasiEnv>,
44 sock: WasiFd,
45 multiaddr: Ipv6Addr,
46 iface: u32,
47) -> Result<Result<(), Errno>, WasiError> {
48 let env = ctx.data();
49 wasi_try_ok_ok!(__sock_actor_mut(ctx, sock, Rights::empty(), |socket, _| {
50 socket.join_multicast_v6(multiaddr, iface)
51 }));
52 Ok(Ok(()))
53}