wasmer_wasix/syscalls/wasix/
sock_bind.rs1use super::*;
2use crate::syscalls::*;
3
4#[instrument(level = "trace", skip_all, fields(%sock, addr = field::Empty), ret)]
13pub fn sock_bind<M: MemorySize>(
14 mut ctx: FunctionEnvMut<'_, WasiEnv>,
15 sock: WasiFd,
16 addr: WasmPtr<__wasi_addr_port_t, M>,
17) -> Result<Errno, WasiError> {
18 WasiEnv::do_pending_operations(&mut ctx)?;
19
20 let env = ctx.data();
21 let memory = unsafe { env.memory_view(&ctx) };
22
23 let addr = wasi_try_ok!(crate::net::read_ip_port(&memory, addr));
24 let addr = SocketAddr::new(addr.0, addr.1);
25 Span::current().record("addr", format!("{addr:?}"));
26
27 wasi_try_ok!(sock_bind_internal(&mut ctx, sock, addr)?);
28
29 #[cfg(feature = "journal")]
30 if ctx.data().enable_journal {
31 let effective_addr = match __sock_actor(&mut ctx, sock, Rights::empty(), |socket, _| {
32 socket.addr_local()
33 }) {
34 Ok(effective_addr) => effective_addr,
35 Err(err) => {
36 tracing::warn!(
37 "failed to determine effective local socket address for journaling; \
38 falling back to requested bind address {:?}: {}",
39 addr,
40 err
41 );
42 addr
43 }
44 };
45 JournalEffector::save_sock_bind(&mut ctx, sock, effective_addr).map_err(|err| {
46 tracing::error!("failed to save sock_bind event - {}", err);
47 WasiError::Exit(ExitCode::from(Errno::Fault))
48 })?;
49 }
50
51 Ok(Errno::Success)
52}
53
54pub(crate) fn sock_bind_internal(
55 ctx: &mut FunctionEnvMut<'_, WasiEnv>,
56 sock: WasiFd,
57 addr: SocketAddr,
58) -> Result<Result<(), Errno>, WasiError> {
59 let env = ctx.data();
60 let net = env.net().clone();
61
62 let tasks = ctx.data().tasks().clone();
63 wasi_try_ok_ok!(__sock_upgrade(
64 ctx,
65 sock,
66 Rights::SOCK_BIND,
67 move |socket, _| async move { socket.bind(tasks.deref(), net.deref(), addr).await }
68 ));
69
70 Ok(Ok(()))
71}