1b8a62b91Sopenharmony_ci//! `recv` and `send`, and variants.
2b8a62b91Sopenharmony_ci
3b8a62b91Sopenharmony_ci#[cfg(unix)]
4b8a62b91Sopenharmony_ciuse crate::net::SocketAddrUnix;
5b8a62b91Sopenharmony_ciuse crate::net::{SocketAddr, SocketAddrAny, SocketAddrV4, SocketAddrV6};
6b8a62b91Sopenharmony_ciuse crate::{backend, io};
7b8a62b91Sopenharmony_ciuse backend::fd::{AsFd, BorrowedFd};
8b8a62b91Sopenharmony_ci
9b8a62b91Sopenharmony_cipub use backend::net::send_recv::{RecvFlags, SendFlags};
10b8a62b91Sopenharmony_ci
11b8a62b91Sopenharmony_ci/// `recv(fd, buf, flags)`—Reads data from a socket.
12b8a62b91Sopenharmony_ci///
13b8a62b91Sopenharmony_ci/// # References
14b8a62b91Sopenharmony_ci///  - [POSIX]
15b8a62b91Sopenharmony_ci///  - [Linux]
16b8a62b91Sopenharmony_ci///  - [Apple]
17b8a62b91Sopenharmony_ci///  - [Winsock2]
18b8a62b91Sopenharmony_ci///
19b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/recv.html
20b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/recv.2.html
21b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/recv.2.html
22b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-recv
23b8a62b91Sopenharmony_ci#[inline]
24b8a62b91Sopenharmony_cipub fn recv<Fd: AsFd>(fd: Fd, buf: &mut [u8], flags: RecvFlags) -> io::Result<usize> {
25b8a62b91Sopenharmony_ci    backend::net::syscalls::recv(fd.as_fd(), buf, flags)
26b8a62b91Sopenharmony_ci}
27b8a62b91Sopenharmony_ci
28b8a62b91Sopenharmony_ci/// `send(fd, buf, flags)`—Writes data to a socket.
29b8a62b91Sopenharmony_ci///
30b8a62b91Sopenharmony_ci/// # References
31b8a62b91Sopenharmony_ci///  - [POSIX]
32b8a62b91Sopenharmony_ci///  - [Linux]
33b8a62b91Sopenharmony_ci///  - [Apple]
34b8a62b91Sopenharmony_ci///  - [Winsock2]
35b8a62b91Sopenharmony_ci///
36b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html
37b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/send.2.html
38b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/send.2.html
39b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-send
40b8a62b91Sopenharmony_ci#[inline]
41b8a62b91Sopenharmony_cipub fn send<Fd: AsFd>(fd: Fd, buf: &[u8], flags: SendFlags) -> io::Result<usize> {
42b8a62b91Sopenharmony_ci    backend::net::syscalls::send(fd.as_fd(), buf, flags)
43b8a62b91Sopenharmony_ci}
44b8a62b91Sopenharmony_ci
45b8a62b91Sopenharmony_ci/// `recvfrom(fd, buf, flags, addr, len)`—Reads data from a socket and
46b8a62b91Sopenharmony_ci/// returns the sender address.
47b8a62b91Sopenharmony_ci///
48b8a62b91Sopenharmony_ci/// # References
49b8a62b91Sopenharmony_ci///  - [POSIX]
50b8a62b91Sopenharmony_ci///  - [Linux]
51b8a62b91Sopenharmony_ci///  - [Apple]
52b8a62b91Sopenharmony_ci///  - [Winsock2]
53b8a62b91Sopenharmony_ci///
54b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html
55b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/recvfrom.2.html
56b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/recvfrom.2.html
57b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-recvfrom
58b8a62b91Sopenharmony_ci#[inline]
59b8a62b91Sopenharmony_cipub fn recvfrom<Fd: AsFd>(
60b8a62b91Sopenharmony_ci    fd: Fd,
61b8a62b91Sopenharmony_ci    buf: &mut [u8],
62b8a62b91Sopenharmony_ci    flags: RecvFlags,
63b8a62b91Sopenharmony_ci) -> io::Result<(usize, Option<SocketAddrAny>)> {
64b8a62b91Sopenharmony_ci    backend::net::syscalls::recvfrom(fd.as_fd(), buf, flags)
65b8a62b91Sopenharmony_ci}
66b8a62b91Sopenharmony_ci
67b8a62b91Sopenharmony_ci/// `sendto(fd, buf, flags, addr)`—Writes data to a socket to a specific IP
68b8a62b91Sopenharmony_ci/// address.
69b8a62b91Sopenharmony_ci///
70b8a62b91Sopenharmony_ci/// # References
71b8a62b91Sopenharmony_ci///  - [POSIX]
72b8a62b91Sopenharmony_ci///  - [Linux]
73b8a62b91Sopenharmony_ci///  - [Apple]
74b8a62b91Sopenharmony_ci///  - [Winsock2]
75b8a62b91Sopenharmony_ci///
76b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/sendto.html
77b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/sendto.2.html
78b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/sendto.2.html
79b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-sendto
80b8a62b91Sopenharmony_cipub fn sendto<Fd: AsFd>(
81b8a62b91Sopenharmony_ci    fd: Fd,
82b8a62b91Sopenharmony_ci    buf: &[u8],
83b8a62b91Sopenharmony_ci    flags: SendFlags,
84b8a62b91Sopenharmony_ci    addr: &SocketAddr,
85b8a62b91Sopenharmony_ci) -> io::Result<usize> {
86b8a62b91Sopenharmony_ci    _sendto(fd.as_fd(), buf, flags, addr)
87b8a62b91Sopenharmony_ci}
88b8a62b91Sopenharmony_ci
89b8a62b91Sopenharmony_cifn _sendto(
90b8a62b91Sopenharmony_ci    fd: BorrowedFd<'_>,
91b8a62b91Sopenharmony_ci    buf: &[u8],
92b8a62b91Sopenharmony_ci    flags: SendFlags,
93b8a62b91Sopenharmony_ci    addr: &SocketAddr,
94b8a62b91Sopenharmony_ci) -> io::Result<usize> {
95b8a62b91Sopenharmony_ci    match addr {
96b8a62b91Sopenharmony_ci        SocketAddr::V4(v4) => backend::net::syscalls::sendto_v4(fd, buf, flags, v4),
97b8a62b91Sopenharmony_ci        SocketAddr::V6(v6) => backend::net::syscalls::sendto_v6(fd, buf, flags, v6),
98b8a62b91Sopenharmony_ci    }
99b8a62b91Sopenharmony_ci}
100b8a62b91Sopenharmony_ci
101b8a62b91Sopenharmony_ci/// `sendto(fd, buf, flags, addr)`—Writes data to a socket to a specific
102b8a62b91Sopenharmony_ci/// address.
103b8a62b91Sopenharmony_ci///
104b8a62b91Sopenharmony_ci/// # References
105b8a62b91Sopenharmony_ci///  - [POSIX]
106b8a62b91Sopenharmony_ci///  - [Linux]
107b8a62b91Sopenharmony_ci///  - [Apple]
108b8a62b91Sopenharmony_ci///  - [Winsock2]
109b8a62b91Sopenharmony_ci///
110b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/sendto.html
111b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/sendto.2.html
112b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/sendto.2.html
113b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-sendto
114b8a62b91Sopenharmony_cipub fn sendto_any<Fd: AsFd>(
115b8a62b91Sopenharmony_ci    fd: Fd,
116b8a62b91Sopenharmony_ci    buf: &[u8],
117b8a62b91Sopenharmony_ci    flags: SendFlags,
118b8a62b91Sopenharmony_ci    addr: &SocketAddrAny,
119b8a62b91Sopenharmony_ci) -> io::Result<usize> {
120b8a62b91Sopenharmony_ci    _sendto_any(fd.as_fd(), buf, flags, addr)
121b8a62b91Sopenharmony_ci}
122b8a62b91Sopenharmony_ci
123b8a62b91Sopenharmony_cifn _sendto_any(
124b8a62b91Sopenharmony_ci    fd: BorrowedFd<'_>,
125b8a62b91Sopenharmony_ci    buf: &[u8],
126b8a62b91Sopenharmony_ci    flags: SendFlags,
127b8a62b91Sopenharmony_ci    addr: &SocketAddrAny,
128b8a62b91Sopenharmony_ci) -> io::Result<usize> {
129b8a62b91Sopenharmony_ci    match addr {
130b8a62b91Sopenharmony_ci        SocketAddrAny::V4(v4) => backend::net::syscalls::sendto_v4(fd, buf, flags, v4),
131b8a62b91Sopenharmony_ci        SocketAddrAny::V6(v6) => backend::net::syscalls::sendto_v6(fd, buf, flags, v6),
132b8a62b91Sopenharmony_ci        #[cfg(unix)]
133b8a62b91Sopenharmony_ci        SocketAddrAny::Unix(unix) => backend::net::syscalls::sendto_unix(fd, buf, flags, unix),
134b8a62b91Sopenharmony_ci    }
135b8a62b91Sopenharmony_ci}
136b8a62b91Sopenharmony_ci
137b8a62b91Sopenharmony_ci/// `sendto(fd, buf, flags, addr, sizeof(struct sockaddr_in))`—Writes data to
138b8a62b91Sopenharmony_ci/// a socket to a specific IPv4 address.
139b8a62b91Sopenharmony_ci///
140b8a62b91Sopenharmony_ci/// # References
141b8a62b91Sopenharmony_ci///  - [POSIX]
142b8a62b91Sopenharmony_ci///  - [Linux]
143b8a62b91Sopenharmony_ci///  - [Apple]
144b8a62b91Sopenharmony_ci///  - [Winsock2]
145b8a62b91Sopenharmony_ci///
146b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/sendto.html
147b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/sendto.2.html
148b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/sendto.2.html
149b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-sendto
150b8a62b91Sopenharmony_ci#[inline]
151b8a62b91Sopenharmony_ci#[doc(alias = "sendto")]
152b8a62b91Sopenharmony_cipub fn sendto_v4<Fd: AsFd>(
153b8a62b91Sopenharmony_ci    fd: Fd,
154b8a62b91Sopenharmony_ci    buf: &[u8],
155b8a62b91Sopenharmony_ci    flags: SendFlags,
156b8a62b91Sopenharmony_ci    addr: &SocketAddrV4,
157b8a62b91Sopenharmony_ci) -> io::Result<usize> {
158b8a62b91Sopenharmony_ci    backend::net::syscalls::sendto_v4(fd.as_fd(), buf, flags, addr)
159b8a62b91Sopenharmony_ci}
160b8a62b91Sopenharmony_ci
161b8a62b91Sopenharmony_ci/// `sendto(fd, buf, flags, addr, sizeof(struct sockaddr_in6))`—Writes data
162b8a62b91Sopenharmony_ci/// to a socket to a specific IPv6 address.
163b8a62b91Sopenharmony_ci///
164b8a62b91Sopenharmony_ci/// # References
165b8a62b91Sopenharmony_ci///  - [POSIX]
166b8a62b91Sopenharmony_ci///  - [Linux]
167b8a62b91Sopenharmony_ci///  - [Apple]
168b8a62b91Sopenharmony_ci///  - [Winsock2]
169b8a62b91Sopenharmony_ci///
170b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/sendto.html
171b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/sendto.2.html
172b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/sendto.2.html
173b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-sendto
174b8a62b91Sopenharmony_ci#[inline]
175b8a62b91Sopenharmony_ci#[doc(alias = "sendto")]
176b8a62b91Sopenharmony_cipub fn sendto_v6<Fd: AsFd>(
177b8a62b91Sopenharmony_ci    fd: Fd,
178b8a62b91Sopenharmony_ci    buf: &[u8],
179b8a62b91Sopenharmony_ci    flags: SendFlags,
180b8a62b91Sopenharmony_ci    addr: &SocketAddrV6,
181b8a62b91Sopenharmony_ci) -> io::Result<usize> {
182b8a62b91Sopenharmony_ci    backend::net::syscalls::sendto_v6(fd.as_fd(), buf, flags, addr)
183b8a62b91Sopenharmony_ci}
184b8a62b91Sopenharmony_ci
185b8a62b91Sopenharmony_ci/// `sendto(fd, buf, flags, addr, sizeof(struct sockaddr_un))`—Writes data to
186b8a62b91Sopenharmony_ci/// a socket to a specific Unix-domain socket address.
187b8a62b91Sopenharmony_ci///
188b8a62b91Sopenharmony_ci/// # References
189b8a62b91Sopenharmony_ci///  - [POSIX]
190b8a62b91Sopenharmony_ci///  - [Linux]
191b8a62b91Sopenharmony_ci///  - [Apple]
192b8a62b91Sopenharmony_ci///  - [Winsock2]
193b8a62b91Sopenharmony_ci///
194b8a62b91Sopenharmony_ci/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/sendto.html
195b8a62b91Sopenharmony_ci/// [Linux]: https://man7.org/linux/man-pages/man2/sendto.2.html
196b8a62b91Sopenharmony_ci/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/sendto.2.html
197b8a62b91Sopenharmony_ci/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-sendto
198b8a62b91Sopenharmony_ci#[cfg(unix)]
199b8a62b91Sopenharmony_ci#[inline]
200b8a62b91Sopenharmony_ci#[doc(alias = "sendto")]
201b8a62b91Sopenharmony_cipub fn sendto_unix<Fd: AsFd>(
202b8a62b91Sopenharmony_ci    fd: Fd,
203b8a62b91Sopenharmony_ci    buf: &[u8],
204b8a62b91Sopenharmony_ci    flags: SendFlags,
205b8a62b91Sopenharmony_ci    addr: &SocketAddrUnix,
206b8a62b91Sopenharmony_ci) -> io::Result<usize> {
207b8a62b91Sopenharmony_ci    backend::net::syscalls::sendto_unix(fd.as_fd(), buf, flags, addr)
208b8a62b91Sopenharmony_ci}
209b8a62b91Sopenharmony_ci
210b8a62b91Sopenharmony_ci// TODO: `recvmsg`, `sendmsg`
211