use std::io;
use std::net::{self, SocketAddr};
use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
use crate::event::{Evented, EventedId};
use crate::poll::{Interests, PollOption, Poller};
use crate::sys::unix::EventedFd;
#[derive(Debug)]
pub struct UdpSocket {
socket: net::UdpSocket,
}
impl UdpSocket {
pub fn bind(address: SocketAddr) -> io::Result<UdpSocket> {
let socket = net::UdpSocket::bind(address)?;
socket.set_nonblocking(true)?;
Ok(UdpSocket { socket })
}
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.socket.local_addr()
}
pub fn send_to(&self, buf: &[u8], target: &SocketAddr) -> io::Result<usize> {
self.socket.send_to(buf, target)
}
pub fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
self.socket.recv_from(buf)
}
pub fn peek_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
self.socket.peek_from(buf)
}
pub fn connect(&self, address: SocketAddr) -> io::Result<()> {
self.socket.connect(address)
}
pub fn send(&self, buf: &[u8]) -> io::Result<usize> {
self.socket.send(buf)
}
pub fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
self.socket.recv(buf)
}
pub fn peek(&self, buf: &mut [u8]) -> io::Result<usize> {
self.socket.peek(buf)
}
pub fn take_error(&self) -> io::Result<Option<io::Error>> {
self.socket.take_error()
}
}
impl Evented for UdpSocket {
fn register(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
EventedFd(&self.as_raw_fd()).register(poller, id, interests, opt)
}
fn reregister(&mut self, poller: &mut Poller, id: EventedId, interests: Interests, opt: PollOption) -> io::Result<()> {
EventedFd(&self.as_raw_fd()).reregister(poller, id, interests, opt)
}
fn deregister(&mut self, poller: &mut Poller) -> io::Result<()> {
EventedFd(&self.as_raw_fd()).deregister(poller)
}
}
impl FromRawFd for UdpSocket {
unsafe fn from_raw_fd(fd: RawFd) -> UdpSocket {
UdpSocket {
socket: net::UdpSocket::from_raw_fd(fd),
}
}
}
impl IntoRawFd for UdpSocket {
fn into_raw_fd(self) -> RawFd {
self.socket.into_raw_fd()
}
}
impl AsRawFd for UdpSocket {
fn as_raw_fd(&self) -> RawFd {
self.socket.as_raw_fd()
}
}