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}