1b8a62b91Sopenharmony_ciuse crate::fd::OwnedFd;
2b8a62b91Sopenharmony_ciuse crate::net::{SocketAddr, SocketAddrAny, SocketAddrV4, SocketAddrV6};
3b8a62b91Sopenharmony_ciuse crate::{backend, io};
4b8a62b91Sopenharmony_ciuse backend::fd::{AsFd, BorrowedFd};
5b8a62b91Sopenharmony_ci
6b8a62b91Sopenharmony_ci#[cfg(unix)]
7b8a62b91Sopenharmony_cipub use backend::net::addr::SocketAddrUnix;
8b8a62b91Sopenharmony_cipub use backend::net::types::{
9b8a62b91Sopenharmony_ci    AcceptFlags, AddressFamily, Protocol, Shutdown, SocketFlags, SocketType,
10b8a62b91Sopenharmony_ci};
11b8a62b91Sopenharmony_ci
12b8a62b91Sopenharmony_ciimpl Default for Protocol {
13b8a62b91Sopenharmony_ci    #[inline]
14b8a62b91Sopenharmony_ci    fn default() -> Self {
15b8a62b91Sopenharmony_ci        Self::IP
16b8a62b91Sopenharmony_ci    }
17b8a62b91Sopenharmony_ci}
18b8a62b91Sopenharmony_ci
19b8a62b91Sopenharmony_ci/// `socket(domain, type_, protocol)`—Creates a socket.
20b8a62b91Sopenharmony_ci///
21b8a62b91Sopenharmony_ci/// POSIX guarantees that `socket` will use the lowest unused file descriptor,
22b8a62b91Sopenharmony_ci/// however it is not safe in general to rely on this, as file descriptors
23b8a62b91Sopenharmony_ci/// may be unexpectedly allocated on other threads or in libraries.
24b8a62b91Sopenharmony_ci///
25b8a62b91Sopenharmony_ci/// To pass extra flags such as [`SocketFlags::CLOEXEC`], use [`socket_with`].
26b8a62b91Sopenharmony_ci///
27b8a62b91Sopenharmony_ci/// # References
28b8a62b91Sopenharmony_ci///  - [POSIX]
29b8a62b91Sopenharmony_ci///  - [Linux]
30b8a62b91Sopenharmony_ci///  - [Apple]
31b8a62b91Sopenharmony_ci///  - [Winsock2]
32b8a62b91Sopenharmony_ci///
33b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/socket.html
34b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/socket.2.html
35b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/socket.2.html
36b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket
37b8a62b91Sopenharmony_ci#[inline]
38b8a62b91Sopenharmony_cipub fn socket(domain: AddressFamily, type_: SocketType, protocol: Protocol) -> io::Result<OwnedFd> {
39b8a62b91Sopenharmony_ci    backend::net::syscalls::socket(domain, type_, protocol)
40b8a62b91Sopenharmony_ci}
41b8a62b91Sopenharmony_ci
42b8a62b91Sopenharmony_ci/// `socket_with(domain, type_ | flags, protocol)`—Creates a socket, with
43b8a62b91Sopenharmony_ci/// flags.
44b8a62b91Sopenharmony_ci///
45b8a62b91Sopenharmony_ci/// POSIX guarantees that `socket` will use the lowest unused file descriptor,
46b8a62b91Sopenharmony_ci/// however it is not safe in general to rely on this, as file descriptors
47b8a62b91Sopenharmony_ci/// may be unexpectedly allocated on other threads or in libraries.
48b8a62b91Sopenharmony_ci///
49b8a62b91Sopenharmony_ci/// `socket_with` is the same as [`socket`] but adds an additional flags
50b8a62b91Sopenharmony_ci/// operand.
51b8a62b91Sopenharmony_ci///
52b8a62b91Sopenharmony_ci/// # References
53b8a62b91Sopenharmony_ci///  - [POSIX]
54b8a62b91Sopenharmony_ci///  - [Linux]
55b8a62b91Sopenharmony_ci///  - [Apple]
56b8a62b91Sopenharmony_ci///  - [Winsock2]
57b8a62b91Sopenharmony_ci///
58b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/socket.html
59b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/socket.2.html
60b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/socket.2.html
61b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket
62b8a62b91Sopenharmony_ci#[inline]
63b8a62b91Sopenharmony_cipub fn socket_with(
64b8a62b91Sopenharmony_ci    domain: AddressFamily,
65b8a62b91Sopenharmony_ci    type_: SocketType,
66b8a62b91Sopenharmony_ci    flags: SocketFlags,
67b8a62b91Sopenharmony_ci    protocol: Protocol,
68b8a62b91Sopenharmony_ci) -> io::Result<OwnedFd> {
69b8a62b91Sopenharmony_ci    backend::net::syscalls::socket_with(domain, type_, flags, protocol)
70b8a62b91Sopenharmony_ci}
71b8a62b91Sopenharmony_ci
72b8a62b91Sopenharmony_ci/// `bind(sockfd, addr)`—Binds a socket to an IP address.
73b8a62b91Sopenharmony_ci///
74b8a62b91Sopenharmony_ci/// # References
75b8a62b91Sopenharmony_ci///  - [POSIX]
76b8a62b91Sopenharmony_ci///  - [Linux]
77b8a62b91Sopenharmony_ci///  - [Apple]
78b8a62b91Sopenharmony_ci///  - [Winsock2]
79b8a62b91Sopenharmony_ci///
80b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/bind.html
81b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/bind.2.html
82b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/bind.2.html
83b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind
84b8a62b91Sopenharmony_cipub fn bind<Fd: AsFd>(sockfd: Fd, addr: &SocketAddr) -> io::Result<()> {
85b8a62b91Sopenharmony_ci    _bind(sockfd.as_fd(), addr)
86b8a62b91Sopenharmony_ci}
87b8a62b91Sopenharmony_ci
88b8a62b91Sopenharmony_cifn _bind(sockfd: BorrowedFd<'_>, addr: &SocketAddr) -> io::Result<()> {
89b8a62b91Sopenharmony_ci    match addr {
90b8a62b91Sopenharmony_ci        SocketAddr::V4(v4) => backend::net::syscalls::bind_v4(sockfd, v4),
91b8a62b91Sopenharmony_ci        SocketAddr::V6(v6) => backend::net::syscalls::bind_v6(sockfd, v6),
92b8a62b91Sopenharmony_ci    }
93b8a62b91Sopenharmony_ci}
94b8a62b91Sopenharmony_ci
95b8a62b91Sopenharmony_ci/// `bind(sockfd, addr)`—Binds a socket to an address.
96b8a62b91Sopenharmony_ci///
97b8a62b91Sopenharmony_ci/// # References
98b8a62b91Sopenharmony_ci///  - [POSIX]
99b8a62b91Sopenharmony_ci///  - [Linux]
100b8a62b91Sopenharmony_ci///  - [Apple]
101b8a62b91Sopenharmony_ci///  - [Winsock2]
102b8a62b91Sopenharmony_ci///
103b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/bind.html
104b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/bind.2.html
105b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/bind.2.html
106b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind
107b8a62b91Sopenharmony_ci#[doc(alias = "bind")]
108b8a62b91Sopenharmony_cipub fn bind_any<Fd: AsFd>(sockfd: Fd, addr: &SocketAddrAny) -> io::Result<()> {
109b8a62b91Sopenharmony_ci    _bind_any(sockfd.as_fd(), addr)
110b8a62b91Sopenharmony_ci}
111b8a62b91Sopenharmony_ci
112b8a62b91Sopenharmony_cifn _bind_any(sockfd: BorrowedFd<'_>, addr: &SocketAddrAny) -> io::Result<()> {
113b8a62b91Sopenharmony_ci    match addr {
114b8a62b91Sopenharmony_ci        SocketAddrAny::V4(v4) => backend::net::syscalls::bind_v4(sockfd, v4),
115b8a62b91Sopenharmony_ci        SocketAddrAny::V6(v6) => backend::net::syscalls::bind_v6(sockfd, v6),
116b8a62b91Sopenharmony_ci        #[cfg(unix)]
117b8a62b91Sopenharmony_ci        SocketAddrAny::Unix(unix) => backend::net::syscalls::bind_unix(sockfd, unix),
118b8a62b91Sopenharmony_ci    }
119b8a62b91Sopenharmony_ci}
120b8a62b91Sopenharmony_ci
121b8a62b91Sopenharmony_ci/// `bind(sockfd, addr, sizeof(struct sockaddr_in))`—Binds a socket to an
122b8a62b91Sopenharmony_ci/// IPv4 address.
123b8a62b91Sopenharmony_ci///
124b8a62b91Sopenharmony_ci/// # References
125b8a62b91Sopenharmony_ci///  - [POSIX]
126b8a62b91Sopenharmony_ci///  - [Linux]
127b8a62b91Sopenharmony_ci///  - [Apple]
128b8a62b91Sopenharmony_ci///  - [Winsock2]
129b8a62b91Sopenharmony_ci///
130b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/bind.html
131b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/bind.2.html
132b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/bind.2.html
133b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind
134b8a62b91Sopenharmony_ci#[inline]
135b8a62b91Sopenharmony_ci#[doc(alias = "bind")]
136b8a62b91Sopenharmony_cipub fn bind_v4<Fd: AsFd>(sockfd: Fd, addr: &SocketAddrV4) -> io::Result<()> {
137b8a62b91Sopenharmony_ci    backend::net::syscalls::bind_v4(sockfd.as_fd(), addr)
138b8a62b91Sopenharmony_ci}
139b8a62b91Sopenharmony_ci
140b8a62b91Sopenharmony_ci/// `bind(sockfd, addr, sizeof(struct sockaddr_in6))`—Binds a socket to an
141b8a62b91Sopenharmony_ci/// IPv6 address.
142b8a62b91Sopenharmony_ci///
143b8a62b91Sopenharmony_ci/// # References
144b8a62b91Sopenharmony_ci///  - [POSIX]
145b8a62b91Sopenharmony_ci///  - [Linux]
146b8a62b91Sopenharmony_ci///  - [Apple]
147b8a62b91Sopenharmony_ci///  - [Winsock2]
148b8a62b91Sopenharmony_ci///
149b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/bind.html
150b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/bind.2.html
151b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/bind.2.html
152b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind
153b8a62b91Sopenharmony_ci#[inline]
154b8a62b91Sopenharmony_ci#[doc(alias = "bind")]
155b8a62b91Sopenharmony_cipub fn bind_v6<Fd: AsFd>(sockfd: Fd, addr: &SocketAddrV6) -> io::Result<()> {
156b8a62b91Sopenharmony_ci    backend::net::syscalls::bind_v6(sockfd.as_fd(), addr)
157b8a62b91Sopenharmony_ci}
158b8a62b91Sopenharmony_ci
159b8a62b91Sopenharmony_ci/// `bind(sockfd, addr, sizeof(struct sockaddr_un))`—Binds a socket to a
160b8a62b91Sopenharmony_ci/// Unix-domain address.
161b8a62b91Sopenharmony_ci///
162b8a62b91Sopenharmony_ci/// # References
163b8a62b91Sopenharmony_ci///  - [POSIX]
164b8a62b91Sopenharmony_ci///  - [Linux]
165b8a62b91Sopenharmony_ci///  - [Apple]
166b8a62b91Sopenharmony_ci///  - [Winsock2]
167b8a62b91Sopenharmony_ci///
168b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/bind.html
169b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/bind.2.html
170b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/bind.2.html
171b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind
172b8a62b91Sopenharmony_ci#[cfg(unix)]
173b8a62b91Sopenharmony_ci#[inline]
174b8a62b91Sopenharmony_ci#[doc(alias = "bind")]
175b8a62b91Sopenharmony_cipub fn bind_unix<Fd: AsFd>(sockfd: Fd, addr: &SocketAddrUnix) -> io::Result<()> {
176b8a62b91Sopenharmony_ci    backend::net::syscalls::bind_unix(sockfd.as_fd(), addr)
177b8a62b91Sopenharmony_ci}
178b8a62b91Sopenharmony_ci
179b8a62b91Sopenharmony_ci/// `connect(sockfd, addr)`—Initiates a connection to an IP address.
180b8a62b91Sopenharmony_ci///
181b8a62b91Sopenharmony_ci/// # References
182b8a62b91Sopenharmony_ci///  - [POSIX]
183b8a62b91Sopenharmony_ci///  - [Linux]
184b8a62b91Sopenharmony_ci///  - [Apple]
185b8a62b91Sopenharmony_ci///  - [Winsock2]
186b8a62b91Sopenharmony_ci///
187b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/connect.html
188b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/connect.2.html
189b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/connect.2.html
190b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
191b8a62b91Sopenharmony_cipub fn connect<Fd: AsFd>(sockfd: Fd, addr: &SocketAddr) -> io::Result<()> {
192b8a62b91Sopenharmony_ci    _connect(sockfd.as_fd(), addr)
193b8a62b91Sopenharmony_ci}
194b8a62b91Sopenharmony_ci
195b8a62b91Sopenharmony_cifn _connect(sockfd: BorrowedFd<'_>, addr: &SocketAddr) -> io::Result<()> {
196b8a62b91Sopenharmony_ci    match addr {
197b8a62b91Sopenharmony_ci        SocketAddr::V4(v4) => backend::net::syscalls::connect_v4(sockfd, v4),
198b8a62b91Sopenharmony_ci        SocketAddr::V6(v6) => backend::net::syscalls::connect_v6(sockfd, v6),
199b8a62b91Sopenharmony_ci    }
200b8a62b91Sopenharmony_ci}
201b8a62b91Sopenharmony_ci
202b8a62b91Sopenharmony_ci/// `connect(sockfd, addr)`—Initiates a connection.
203b8a62b91Sopenharmony_ci///
204b8a62b91Sopenharmony_ci/// # References
205b8a62b91Sopenharmony_ci///  - [POSIX]
206b8a62b91Sopenharmony_ci///  - [Linux]
207b8a62b91Sopenharmony_ci///  - [Apple]
208b8a62b91Sopenharmony_ci///  - [Winsock2]
209b8a62b91Sopenharmony_ci///
210b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/connect.html
211b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/connect.2.html
212b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/connect.2.html
213b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
214b8a62b91Sopenharmony_ci#[doc(alias = "connect")]
215b8a62b91Sopenharmony_cipub fn connect_any<Fd: AsFd>(sockfd: Fd, addr: &SocketAddrAny) -> io::Result<()> {
216b8a62b91Sopenharmony_ci    _connect_any(sockfd.as_fd(), addr)
217b8a62b91Sopenharmony_ci}
218b8a62b91Sopenharmony_ci
219b8a62b91Sopenharmony_cifn _connect_any(sockfd: BorrowedFd<'_>, addr: &SocketAddrAny) -> io::Result<()> {
220b8a62b91Sopenharmony_ci    match addr {
221b8a62b91Sopenharmony_ci        SocketAddrAny::V4(v4) => backend::net::syscalls::connect_v4(sockfd, v4),
222b8a62b91Sopenharmony_ci        SocketAddrAny::V6(v6) => backend::net::syscalls::connect_v6(sockfd, v6),
223b8a62b91Sopenharmony_ci        #[cfg(unix)]
224b8a62b91Sopenharmony_ci        SocketAddrAny::Unix(unix) => backend::net::syscalls::connect_unix(sockfd, unix),
225b8a62b91Sopenharmony_ci    }
226b8a62b91Sopenharmony_ci}
227b8a62b91Sopenharmony_ci
228b8a62b91Sopenharmony_ci/// `connect(sockfd, addr, sizeof(struct sockaddr_in))`—Initiates a
229b8a62b91Sopenharmony_ci/// connection to an IPv4 address.
230b8a62b91Sopenharmony_ci///
231b8a62b91Sopenharmony_ci/// # References
232b8a62b91Sopenharmony_ci///  - [POSIX]
233b8a62b91Sopenharmony_ci///  - [Linux]
234b8a62b91Sopenharmony_ci///  - [Apple]
235b8a62b91Sopenharmony_ci///  - [Winsock2]
236b8a62b91Sopenharmony_ci///
237b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/connect.html
238b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/connect.2.html
239b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/connect.2.html
240b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
241b8a62b91Sopenharmony_ci#[inline]
242b8a62b91Sopenharmony_ci#[doc(alias = "connect")]
243b8a62b91Sopenharmony_cipub fn connect_v4<Fd: AsFd>(sockfd: Fd, addr: &SocketAddrV4) -> io::Result<()> {
244b8a62b91Sopenharmony_ci    backend::net::syscalls::connect_v4(sockfd.as_fd(), addr)
245b8a62b91Sopenharmony_ci}
246b8a62b91Sopenharmony_ci
247b8a62b91Sopenharmony_ci/// `connect(sockfd, addr, sizeof(struct sockaddr_in6))`—Initiates a
248b8a62b91Sopenharmony_ci/// connection to an IPv6 address.
249b8a62b91Sopenharmony_ci///
250b8a62b91Sopenharmony_ci/// # References
251b8a62b91Sopenharmony_ci///  - [POSIX]
252b8a62b91Sopenharmony_ci///  - [Linux]
253b8a62b91Sopenharmony_ci///  - [Apple]
254b8a62b91Sopenharmony_ci///  - [Winsock2]
255b8a62b91Sopenharmony_ci///
256b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/connect.html
257b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/connect.2.html
258b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/connect.2.html
259b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
260b8a62b91Sopenharmony_ci#[inline]
261b8a62b91Sopenharmony_ci#[doc(alias = "connect")]
262b8a62b91Sopenharmony_cipub fn connect_v6<Fd: AsFd>(sockfd: Fd, addr: &SocketAddrV6) -> io::Result<()> {
263b8a62b91Sopenharmony_ci    backend::net::syscalls::connect_v6(sockfd.as_fd(), addr)
264b8a62b91Sopenharmony_ci}
265b8a62b91Sopenharmony_ci
266b8a62b91Sopenharmony_ci/// `connect(sockfd, addr, sizeof(struct sockaddr_un))`—Initiates a
267b8a62b91Sopenharmony_ci/// connection to a Unix-domain address.
268b8a62b91Sopenharmony_ci///
269b8a62b91Sopenharmony_ci/// # References
270b8a62b91Sopenharmony_ci///  - [POSIX]
271b8a62b91Sopenharmony_ci///  - [Linux]
272b8a62b91Sopenharmony_ci///  - [Apple]
273b8a62b91Sopenharmony_ci///  - [Winsock2]
274b8a62b91Sopenharmony_ci///
275b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/connect.html
276b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/connect.2.html
277b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/connect.2.html
278b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
279b8a62b91Sopenharmony_ci#[cfg(unix)]
280b8a62b91Sopenharmony_ci#[inline]
281b8a62b91Sopenharmony_ci#[doc(alias = "connect")]
282b8a62b91Sopenharmony_cipub fn connect_unix<Fd: AsFd>(sockfd: Fd, addr: &SocketAddrUnix) -> io::Result<()> {
283b8a62b91Sopenharmony_ci    backend::net::syscalls::connect_unix(sockfd.as_fd(), addr)
284b8a62b91Sopenharmony_ci}
285b8a62b91Sopenharmony_ci
286b8a62b91Sopenharmony_ci/// `listen(fd, backlog)`—Enables listening for incoming connections.
287b8a62b91Sopenharmony_ci///
288b8a62b91Sopenharmony_ci/// # References
289b8a62b91Sopenharmony_ci///  - [POSIX]
290b8a62b91Sopenharmony_ci///  - [Linux]
291b8a62b91Sopenharmony_ci///  - [Apple]
292b8a62b91Sopenharmony_ci///  - [Winsock2]
293b8a62b91Sopenharmony_ci///
294b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/listen.html
295b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/listen.2.html
296b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/listen.2.html
297b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-listen
298b8a62b91Sopenharmony_ci#[inline]
299b8a62b91Sopenharmony_cipub fn listen<Fd: AsFd>(sockfd: Fd, backlog: i32) -> io::Result<()> {
300b8a62b91Sopenharmony_ci    backend::net::syscalls::listen(sockfd.as_fd(), backlog)
301b8a62b91Sopenharmony_ci}
302b8a62b91Sopenharmony_ci
303b8a62b91Sopenharmony_ci/// `accept(fd, NULL, NULL)`—Accepts an incoming connection.
304b8a62b91Sopenharmony_ci///
305b8a62b91Sopenharmony_ci/// Use [`acceptfrom`] to retrieve the peer address.
306b8a62b91Sopenharmony_ci///
307b8a62b91Sopenharmony_ci/// POSIX guarantees that `accept` will use the lowest unused file descriptor,
308b8a62b91Sopenharmony_ci/// however it is not safe in general to rely on this, as file descriptors may
309b8a62b91Sopenharmony_ci/// be unexpectedly allocated on other threads or in libraries.
310b8a62b91Sopenharmony_ci///
311b8a62b91Sopenharmony_ci/// # References
312b8a62b91Sopenharmony_ci///  - [POSIX]
313b8a62b91Sopenharmony_ci///  - [Linux]
314b8a62b91Sopenharmony_ci///  - [Apple]
315b8a62b91Sopenharmony_ci///  - [Winsock2]
316b8a62b91Sopenharmony_ci///
317b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html
318b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/accept.2.html
319b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/accept.2.html
320b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept
321b8a62b91Sopenharmony_ci#[inline]
322b8a62b91Sopenharmony_ci#[doc(alias = "accept4")]
323b8a62b91Sopenharmony_cipub fn accept<Fd: AsFd>(sockfd: Fd) -> io::Result<OwnedFd> {
324b8a62b91Sopenharmony_ci    backend::net::syscalls::accept(sockfd.as_fd())
325b8a62b91Sopenharmony_ci}
326b8a62b91Sopenharmony_ci
327b8a62b91Sopenharmony_ci/// `accept4(fd, NULL, NULL, flags)`—Accepts an incoming connection, with
328b8a62b91Sopenharmony_ci/// flags.
329b8a62b91Sopenharmony_ci///
330b8a62b91Sopenharmony_ci/// Use [`acceptfrom_with`] to retrieve the peer address.
331b8a62b91Sopenharmony_ci///
332b8a62b91Sopenharmony_ci/// Even though POSIX guarantees that this will use the lowest unused file
333b8a62b91Sopenharmony_ci/// descriptor, it is not safe in general to rely on this, as file descriptors
334b8a62b91Sopenharmony_ci/// may be unexpectedly allocated on other threads or in libraries.
335b8a62b91Sopenharmony_ci///
336b8a62b91Sopenharmony_ci/// `accept_with` is the same as [`accept`] but adds an additional flags
337b8a62b91Sopenharmony_ci/// operand.
338b8a62b91Sopenharmony_ci///
339b8a62b91Sopenharmony_ci/// # References
340b8a62b91Sopenharmony_ci///  - [Linux]
341b8a62b91Sopenharmony_ci///
342b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/accept4.2.html
343b8a62b91Sopenharmony_ci#[inline]
344b8a62b91Sopenharmony_ci#[doc(alias = "accept4")]
345b8a62b91Sopenharmony_cipub fn accept_with<Fd: AsFd>(sockfd: Fd, flags: AcceptFlags) -> io::Result<OwnedFd> {
346b8a62b91Sopenharmony_ci    backend::net::syscalls::accept_with(sockfd.as_fd(), flags)
347b8a62b91Sopenharmony_ci}
348b8a62b91Sopenharmony_ci
349b8a62b91Sopenharmony_ci/// `accept(fd, &addr, &len)`—Accepts an incoming connection and returns the
350b8a62b91Sopenharmony_ci/// peer address.
351b8a62b91Sopenharmony_ci///
352b8a62b91Sopenharmony_ci/// Use [`accept`] if the peer address isn't needed.
353b8a62b91Sopenharmony_ci///
354b8a62b91Sopenharmony_ci/// # References
355b8a62b91Sopenharmony_ci///  - [POSIX]
356b8a62b91Sopenharmony_ci///  - [Linux]
357b8a62b91Sopenharmony_ci///  - [Apple]
358b8a62b91Sopenharmony_ci///  - [Winsock2]
359b8a62b91Sopenharmony_ci///
360b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html
361b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/accept.2.html
362b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/accept.2.html
363b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept
364b8a62b91Sopenharmony_ci#[inline]
365b8a62b91Sopenharmony_ci#[doc(alias = "accept4")]
366b8a62b91Sopenharmony_cipub fn acceptfrom<Fd: AsFd>(sockfd: Fd) -> io::Result<(OwnedFd, Option<SocketAddrAny>)> {
367b8a62b91Sopenharmony_ci    backend::net::syscalls::acceptfrom(sockfd.as_fd())
368b8a62b91Sopenharmony_ci}
369b8a62b91Sopenharmony_ci
370b8a62b91Sopenharmony_ci/// `accept4(fd, &addr, &len, flags)`—Accepts an incoming connection and
371b8a62b91Sopenharmony_ci/// returns the peer address, with flags.
372b8a62b91Sopenharmony_ci///
373b8a62b91Sopenharmony_ci/// Use [`accept_with`] if the peer address isn't needed.
374b8a62b91Sopenharmony_ci///
375b8a62b91Sopenharmony_ci/// `acceptfrom_with` is the same as [`acceptfrom`] but adds an additional
376b8a62b91Sopenharmony_ci/// flags operand.
377b8a62b91Sopenharmony_ci///
378b8a62b91Sopenharmony_ci/// # References
379b8a62b91Sopenharmony_ci///  - [Linux]
380b8a62b91Sopenharmony_ci///
381b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/accept4.2.html
382b8a62b91Sopenharmony_ci#[inline]
383b8a62b91Sopenharmony_ci#[doc(alias = "accept4")]
384b8a62b91Sopenharmony_cipub fn acceptfrom_with<Fd: AsFd>(
385b8a62b91Sopenharmony_ci    sockfd: Fd,
386b8a62b91Sopenharmony_ci    flags: AcceptFlags,
387b8a62b91Sopenharmony_ci) -> io::Result<(OwnedFd, Option<SocketAddrAny>)> {
388b8a62b91Sopenharmony_ci    backend::net::syscalls::acceptfrom_with(sockfd.as_fd(), flags)
389b8a62b91Sopenharmony_ci}
390b8a62b91Sopenharmony_ci
391b8a62b91Sopenharmony_ci/// `shutdown(fd, how)`—Closes the read and/or write sides of a stream.
392b8a62b91Sopenharmony_ci///
393b8a62b91Sopenharmony_ci/// # References
394b8a62b91Sopenharmony_ci///  - [POSIX]
395b8a62b91Sopenharmony_ci///  - [Linux]
396b8a62b91Sopenharmony_ci///  - [Apple]
397b8a62b91Sopenharmony_ci///  - [Winsock2]
398b8a62b91Sopenharmony_ci///
399b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/shutdown.html
400b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/shutdown.2.html
401b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/shutdown.2.html
402b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-shutdown
403b8a62b91Sopenharmony_ci#[inline]
404b8a62b91Sopenharmony_cipub fn shutdown<Fd: AsFd>(sockfd: Fd, how: Shutdown) -> io::Result<()> {
405b8a62b91Sopenharmony_ci    backend::net::syscalls::shutdown(sockfd.as_fd(), how)
406b8a62b91Sopenharmony_ci}
407b8a62b91Sopenharmony_ci
408b8a62b91Sopenharmony_ci/// `getsockname(fd, addr, len)`—Returns the address a socket is bound to.
409b8a62b91Sopenharmony_ci///
410b8a62b91Sopenharmony_ci/// # References
411b8a62b91Sopenharmony_ci///  - [POSIX]
412b8a62b91Sopenharmony_ci///  - [Linux]
413b8a62b91Sopenharmony_ci///  - [Apple]
414b8a62b91Sopenharmony_ci///  - [Winsock2]
415b8a62b91Sopenharmony_ci///
416b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockname.html
417b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/getsockname.2.html
418b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockname.2.html
419b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockname
420b8a62b91Sopenharmony_ci#[inline]
421b8a62b91Sopenharmony_cipub fn getsockname<Fd: AsFd>(sockfd: Fd) -> io::Result<SocketAddrAny> {
422b8a62b91Sopenharmony_ci    backend::net::syscalls::getsockname(sockfd.as_fd())
423b8a62b91Sopenharmony_ci}
424b8a62b91Sopenharmony_ci
425b8a62b91Sopenharmony_ci/// `getpeername(fd, addr, len)`—Returns the address a socket is connected
426b8a62b91Sopenharmony_ci/// to.
427b8a62b91Sopenharmony_ci///
428b8a62b91Sopenharmony_ci/// # References
429b8a62b91Sopenharmony_ci///  - [POSIX]
430b8a62b91Sopenharmony_ci///  - [Linux]
431b8a62b91Sopenharmony_ci///  - [Apple]
432b8a62b91Sopenharmony_ci///  - [Winsock2]
433b8a62b91Sopenharmony_ci///
434b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpeername.html
435b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/getpeername.2.html
436b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getpeername.2.html
437b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getpeername
438b8a62b91Sopenharmony_ci#[inline]
439b8a62b91Sopenharmony_cipub fn getpeername<Fd: AsFd>(sockfd: Fd) -> io::Result<Option<SocketAddrAny>> {
440b8a62b91Sopenharmony_ci    backend::net::syscalls::getpeername(sockfd.as_fd())
441b8a62b91Sopenharmony_ci}
442