wasmer_wasix/journal/effector/syscalls/
sock_connect.rs

1use std::net::SocketAddr;
2
3use wasmer_wasix_types::wasi::{Addressfamily, SockProto, Socktype};
4
5use crate::{
6    fs::Kind,
7    net::socket::{InodeSocket, InodeSocketKind, SocketProperties},
8};
9
10use super::*;
11
12impl JournalEffector {
13    pub fn save_sock_connect(
14        ctx: &mut FunctionEnvMut<'_, WasiEnv>,
15        fd: Fd,
16        local_addr: SocketAddr,
17        peer_addr: SocketAddr,
18    ) -> anyhow::Result<()> {
19        Self::save_event(
20            ctx,
21            JournalEntry::SocketConnectedV1 {
22                fd,
23                local_addr,
24                peer_addr,
25            },
26        )
27    }
28
29    pub fn apply_sock_connect(
30        ctx: &mut FunctionEnvMut<'_, WasiEnv>,
31        fd: Fd,
32        local_addr: SocketAddr,
33        peer_addr: SocketAddr,
34        dead: bool,
35    ) -> anyhow::Result<()> {
36        let kind = Kind::Socket {
37            socket: InodeSocket::new(InodeSocketKind::RemoteSocket {
38                is_dead: dead,
39                local_addr,
40                peer_addr,
41                ttl: 0,
42                multicast_ttl: 0,
43                props: SocketProperties {
44                    family: match peer_addr.is_ipv4() {
45                        true => Addressfamily::Inet4,
46                        false => Addressfamily::Inet6,
47                    },
48                    ty: Socktype::Stream,
49                    pt: SockProto::Tcp,
50                    only_v6: false,
51                    reuse_port: false,
52                    reuse_addr: false,
53                    no_delay: None,
54                    keep_alive: None,
55                    dont_route: None,
56                    send_buf_size: None,
57                    recv_buf_size: None,
58                    write_timeout: None,
59                    read_timeout: None,
60                    accept_timeout: None,
61                    connect_timeout: None,
62                    handler: None,
63                },
64            }),
65        };
66
67        let env = ctx.data();
68        let state = env.state();
69        let inodes = &state.inodes;
70        let inode = state
71            .fs
72            .create_inode_with_default_stat(inodes, kind, false, "socket".into());
73
74        let rights = Rights::all_socket();
75        state
76            .fs
77            .with_fd(
78                rights,
79                rights,
80                Fdflags::empty(),
81                Fdflagsext::empty(),
82                0,
83                inode,
84                fd,
85            )
86            .map_err(|err| {
87                anyhow::format_err!(
88                    "journal restore error: failed to create remote connected socket - {err}"
89                )
90            })?;
91
92        Ok(())
93    }
94}