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