1use arceos_posix_api::{
2    sys_accept, sys_bind, sys_connect, sys_freeaddrinfo, sys_getaddrinfo, sys_getpeername,
3    sys_getsockname, sys_listen, sys_recv, sys_recvfrom, sys_send, sys_sendto, sys_shutdown,
4    sys_socket,
5};
6use core::ffi::{c_char, c_int, c_void};
7
8use crate::{ctypes, utils::e};
9
10#[unsafe(no_mangle)]
14pub unsafe extern "C" fn socket(domain: c_int, socktype: c_int, protocol: c_int) -> c_int {
15    e(sys_socket(domain, socktype, protocol))
16}
17
18#[unsafe(no_mangle)]
22pub unsafe extern "C" fn bind(
23    socket_fd: c_int,
24    socket_addr: *const ctypes::sockaddr,
25    addrlen: ctypes::socklen_t,
26) -> c_int {
27    e(sys_bind(socket_fd, socket_addr, addrlen))
28}
29
30#[unsafe(no_mangle)]
34pub unsafe extern "C" fn connect(
35    socket_fd: c_int,
36    socket_addr: *const ctypes::sockaddr,
37    addrlen: ctypes::socklen_t,
38) -> c_int {
39    e(sys_connect(socket_fd, socket_addr, addrlen))
40}
41
42#[unsafe(no_mangle)]
46pub unsafe extern "C" fn sendto(
47    socket_fd: c_int,
48    buf_ptr: *const c_void,
49    len: ctypes::size_t,
50    flag: c_int, socket_addr: *const ctypes::sockaddr,
52    addrlen: ctypes::socklen_t,
53) -> ctypes::ssize_t {
54    if socket_addr.is_null() && addrlen == 0 {
55        return e(sys_send(socket_fd, buf_ptr, len, flag) as _) as _;
56    }
57    e(sys_sendto(socket_fd, buf_ptr, len, flag, socket_addr, addrlen) as _) as _
58}
59
60#[unsafe(no_mangle)]
64pub unsafe extern "C" fn send(
65    socket_fd: c_int,
66    buf_ptr: *const c_void,
67    len: ctypes::size_t,
68    flag: c_int, ) -> ctypes::ssize_t {
70    e(sys_send(socket_fd, buf_ptr, len, flag) as _) as _
71}
72
73#[unsafe(no_mangle)]
77pub unsafe extern "C" fn recvfrom(
78    socket_fd: c_int,
79    buf_ptr: *mut c_void,
80    len: ctypes::size_t,
81    flag: c_int, socket_addr: *mut ctypes::sockaddr,
83    addrlen: *mut ctypes::socklen_t,
84) -> ctypes::ssize_t {
85    if socket_addr.is_null() {
86        return e(sys_recv(socket_fd, buf_ptr, len, flag) as _) as _;
87    }
88    e(sys_recvfrom(socket_fd, buf_ptr, len, flag, socket_addr, addrlen) as _) as _
89}
90
91#[unsafe(no_mangle)]
95pub unsafe extern "C" fn recv(
96    socket_fd: c_int,
97    buf_ptr: *mut c_void,
98    len: ctypes::size_t,
99    flag: c_int, ) -> ctypes::ssize_t {
101    e(sys_recv(socket_fd, buf_ptr, len, flag) as _) as _
102}
103
104#[unsafe(no_mangle)]
108pub unsafe extern "C" fn listen(
109    socket_fd: c_int,
110    backlog: c_int, ) -> c_int {
112    e(sys_listen(socket_fd, backlog))
113}
114
115#[unsafe(no_mangle)]
119pub unsafe extern "C" fn accept(
120    socket_fd: c_int,
121    socket_addr: *mut ctypes::sockaddr,
122    socket_len: *mut ctypes::socklen_t,
123) -> c_int {
124    e(sys_accept(socket_fd, socket_addr, socket_len))
125}
126
127#[unsafe(no_mangle)]
131pub unsafe extern "C" fn shutdown(
132    socket_fd: c_int,
133    flag: c_int, ) -> c_int {
135    e(sys_shutdown(socket_fd, flag))
136}
137
138#[unsafe(no_mangle)]
142pub unsafe extern "C" fn getaddrinfo(
143    nodename: *const c_char,
144    servname: *const c_char,
145    hints: *const ctypes::addrinfo,
146    res: *mut *mut ctypes::addrinfo,
147) -> c_int {
148    let ret = e(sys_getaddrinfo(nodename, servname, hints, res));
149    match ret {
150        r if r < 0 => ctypes::EAI_FAIL,
151        0 => ctypes::EAI_NONAME,
152        _ => 0,
153    }
154}
155
156#[unsafe(no_mangle)]
158pub unsafe extern "C" fn freeaddrinfo(res: *mut ctypes::addrinfo) {
159    sys_freeaddrinfo(res);
160}
161
162#[unsafe(no_mangle)]
164pub unsafe extern "C" fn getsockname(
165    sock_fd: c_int,
166    addr: *mut ctypes::sockaddr,
167    addrlen: *mut ctypes::socklen_t,
168) -> c_int {
169    e(sys_getsockname(sock_fd, addr, addrlen))
170}
171
172#[unsafe(no_mangle)]
174pub unsafe extern "C" fn getpeername(
175    sock_fd: c_int,
176    addr: *mut ctypes::sockaddr,
177    addrlen: *mut ctypes::socklen_t,
178) -> c_int {
179    e(sys_getpeername(sock_fd, addr, addrlen))
180}