use crate::net::{Ipv4Addr, Ipv6Addr, SocketAddr};
#[cfg(not(windows))]
use io_extras::os::rustix::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
#[cfg(not(windows))]
use io_lifetimes::{AsFd, BorrowedFd, OwnedFd};
#[cfg(windows)]
use io_lifetimes::{AsSocket, BorrowedSocket, OwnedSocket};
use std::time::Duration;
use std::{fmt, io, net};
#[cfg(windows)]
use {
io_extras::os::windows::{
AsHandleOrSocket, AsRawHandleOrSocket, BorrowedHandleOrSocket, IntoRawHandleOrSocket,
OwnedHandleOrSocket, RawHandleOrSocket,
},
std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket},
};
pub struct UdpSocket {
pub(crate) std: net::UdpSocket,
}
impl UdpSocket {
#[inline]
pub fn from_std(std: net::UdpSocket) -> Self {
Self { std }
}
#[inline]
pub fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
self.std.recv_from(buf)
}
#[inline]
pub fn peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
self.std.peek_from(buf)
}
#[inline]
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
self.std.peer_addr()
}
#[inline]
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.std.local_addr()
}
#[inline]
pub fn try_clone(&self) -> io::Result<Self> {
let udp_socket = self.std.try_clone()?;
Ok(Self::from_std(udp_socket))
}
#[inline]
pub fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
self.std.set_read_timeout(dur)
}
#[inline]
pub fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
self.std.set_write_timeout(dur)
}
#[inline]
pub fn read_timeout(&self) -> io::Result<Option<Duration>> {
self.std.read_timeout()
}
#[inline]
pub fn write_timeout(&self) -> io::Result<Option<Duration>> {
self.std.write_timeout()
}
#[inline]
pub fn set_broadcast(&self, broadcast: bool) -> io::Result<()> {
self.std.set_broadcast(broadcast)
}
#[inline]
pub fn broadcast(&self) -> io::Result<bool> {
self.std.broadcast()
}
#[inline]
pub fn set_multicast_loop_v4(&self, multicast_loop_v4: bool) -> io::Result<()> {
self.std.set_multicast_loop_v4(multicast_loop_v4)
}
#[inline]
pub fn multicast_loop_v4(&self) -> io::Result<bool> {
self.std.multicast_loop_v4()
}
#[inline]
pub fn set_multicast_ttl_v4(&self, multicast_ttl_v4: u32) -> io::Result<()> {
self.std.set_multicast_ttl_v4(multicast_ttl_v4)
}
#[inline]
pub fn multicast_ttl_v4(&self) -> io::Result<u32> {
self.std.multicast_ttl_v4()
}
#[inline]
pub fn set_multicast_loop_v6(&self, multicast_loop_v6: bool) -> io::Result<()> {
self.std.set_multicast_loop_v6(multicast_loop_v6)
}
#[inline]
pub fn multicast_loop_v6(&self) -> io::Result<bool> {
self.std.multicast_loop_v6()
}
#[inline]
pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
self.std.set_ttl(ttl)
}
#[inline]
pub fn ttl(&self) -> io::Result<u32> {
self.std.ttl()
}
#[allow(clippy::trivially_copy_pass_by_ref)]
#[inline]
pub fn join_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> {
self.std.join_multicast_v4(multiaddr, interface)
}
#[allow(clippy::trivially_copy_pass_by_ref)]
#[inline]
pub fn join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> {
self.std.join_multicast_v6(multiaddr, interface)
}
#[allow(clippy::trivially_copy_pass_by_ref)]
#[inline]
pub fn leave_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> {
self.std.leave_multicast_v4(multiaddr, interface)
}
#[allow(clippy::trivially_copy_pass_by_ref)]
#[inline]
pub fn leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> {
self.std.leave_multicast_v6(multiaddr, interface)
}
#[inline]
pub fn take_error(&self) -> io::Result<Option<io::Error>> {
self.std.take_error()
}
#[inline]
pub fn send(&self, buf: &[u8]) -> io::Result<usize> {
self.std.send(buf)
}
#[inline]
pub fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
self.std.recv(buf)
}
#[inline]
pub fn peek(&self, buf: &mut [u8]) -> io::Result<usize> {
self.std.peek(buf)
}
#[inline]
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
self.std.set_nonblocking(nonblocking)
}
}
unsafe impl io_lifetimes::views::SocketlikeViewType for UdpSocket {}
#[cfg(not(windows))]
impl FromRawFd for UdpSocket {
#[inline]
unsafe fn from_raw_fd(fd: RawFd) -> Self {
Self::from_std(net::UdpSocket::from_raw_fd(fd))
}
}
#[cfg(not(windows))]
impl From<OwnedFd> for UdpSocket {
#[inline]
fn from(fd: OwnedFd) -> Self {
Self::from_std(net::UdpSocket::from(fd))
}
}
#[cfg(windows)]
impl FromRawSocket for UdpSocket {
#[inline]
unsafe fn from_raw_socket(socket: RawSocket) -> Self {
Self::from_std(net::UdpSocket::from_raw_socket(socket))
}
}
#[cfg(windows)]
impl From<OwnedSocket> for UdpSocket {
#[inline]
fn from(socket: OwnedSocket) -> Self {
Self::from_std(net::UdpSocket::from(socket))
}
}
#[cfg(not(windows))]
impl AsRawFd for UdpSocket {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.std.as_raw_fd()
}
}
#[cfg(not(windows))]
impl AsFd for UdpSocket {
#[inline]
fn as_fd(&self) -> BorrowedFd<'_> {
self.std.as_fd()
}
}
#[cfg(windows)]
impl AsRawSocket for UdpSocket {
#[inline]
fn as_raw_socket(&self) -> RawSocket {
self.std.as_raw_socket()
}
}
#[cfg(windows)]
impl AsSocket for UdpSocket {
#[inline]
fn as_socket(&self) -> BorrowedSocket<'_> {
self.std.as_socket()
}
}
#[cfg(windows)]
impl AsRawHandleOrSocket for UdpSocket {
#[inline]
fn as_raw_handle_or_socket(&self) -> RawHandleOrSocket {
self.std.as_raw_handle_or_socket()
}
}
#[cfg(windows)]
impl AsHandleOrSocket for UdpSocket {
#[inline]
fn as_handle_or_socket(&self) -> BorrowedHandleOrSocket<'_> {
self.std.as_handle_or_socket()
}
}
#[cfg(not(windows))]
impl IntoRawFd for UdpSocket {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.std.into_raw_fd()
}
}
#[cfg(not(windows))]
impl From<UdpSocket> for OwnedFd {
#[inline]
fn from(socket: UdpSocket) -> OwnedFd {
socket.std.into()
}
}
#[cfg(windows)]
impl IntoRawSocket for UdpSocket {
#[inline]
fn into_raw_socket(self) -> RawSocket {
self.std.into_raw_socket()
}
}
#[cfg(windows)]
impl From<UdpSocket> for OwnedSocket {
#[inline]
fn from(socket: UdpSocket) -> OwnedSocket {
socket.std.into()
}
}
#[cfg(windows)]
impl IntoRawHandleOrSocket for UdpSocket {
#[inline]
fn into_raw_handle_or_socket(self) -> RawHandleOrSocket {
self.std.into_raw_handle_or_socket()
}
}
#[cfg(windows)]
impl From<UdpSocket> for OwnedHandleOrSocket {
#[inline]
fn from(socket: UdpSocket) -> Self {
socket.std.into()
}
}
impl fmt::Debug for UdpSocket {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.std.fmt(f)
}
}