wasmer_wasix/syscalls/wasix/
sock_addr_peer.rs

1use super::*;
2use crate::syscalls::*;
3
4/// ### `sock_addr_peer()`
5/// Returns the remote address to which the socket is connected to.
6///
7/// Note: This is similar to `getpeername` in POSIX
8///
9/// When successful, the contents of the output buffer consist of an IP address,
10/// either IP4 or IP6.
11///
12/// ## Parameters
13///
14/// * `fd` - Socket that the address is bound to
15#[instrument(level = "trace", skip_all, fields(%sock, addr = field::Empty), ret)]
16pub fn sock_addr_peer<M: MemorySize>(
17    mut ctx: FunctionEnvMut<'_, WasiEnv>,
18    sock: WasiFd,
19    ro_addr: WasmPtr<__wasi_addr_port_t, M>,
20) -> Errno {
21    let addr = wasi_try!(__sock_actor(
22        &mut ctx,
23        sock,
24        Rights::empty(),
25        |socket, _| socket.addr_peer()
26    ));
27    Span::current().record("addr", format!("{addr:?}"));
28
29    let env = ctx.data();
30    let memory = unsafe { env.memory_view(&ctx) };
31    wasi_try!(crate::net::write_ip_port(
32        &memory,
33        ro_addr,
34        addr.ip(),
35        addr.port()
36    ));
37    Errno::Success
38}