wasmer_wasix/syscalls/wasix/
sock_join_multicast_v6.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `sock_join_multicast_v6()`
5/// Joins a particular multicast IPv6 group
6///
7/// ## Parameters
8///
9/// * `fd` - Socket descriptor
10/// * `multiaddr` - Multicast group to joined
11/// * `interface` - Interface that will join
12#[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}