use std::io::Result;
use std::net::IpAddr;
use std::time::Duration;
use crate::compat::{set_timeout, timeout, AsInner};
use crate::sys::Socket;
pub struct IcmpSocket {
inner: Socket,
}
impl IcmpSocket {
pub fn connect(addr: IpAddr) -> Result<IcmpSocket> {
let inner = Socket::connect(addr)?;
Ok(IcmpSocket {
inner,
})
}
pub fn recv(&self, buf: &mut [u8]) -> Result<usize> {
self.inner.recv(buf)
}
pub fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, IpAddr)> {
self.inner.recv_from(buf)
}
pub fn send(&mut self, buf: &[u8]) -> Result<usize> {
self.inner.send(buf)
}
pub fn set_read_timeout(&self, dur: Option<Duration>) -> Result<()> {
set_timeout(self.as_inner(), dur, libc::SO_RCVTIMEO)
}
pub fn set_write_timeout(&self, dur: Option<Duration>) -> Result<()> {
set_timeout(self.as_inner(), dur, libc::SO_SNDTIMEO)
}
pub fn read_timeout(&self) -> Result<Option<Duration>> {
timeout(self.as_inner(), libc::SO_RCVTIMEO)
}
pub fn write_timeout(&self) -> Result<Option<Duration>> {
timeout(self.as_inner(), libc::SO_SNDTIMEO)
}
pub fn set_ttl(&self, ttl: u32) -> Result<()> {
self.inner.set_ttl(ttl)
}
pub fn ttl(&self) -> Result<u32> {
self.inner.ttl()
}
pub fn set_broadcast(&self, broadcast: bool) -> Result<()> {
self.inner.set_broadcast(broadcast)
}
pub fn broadcast(&self) -> Result<bool> {
self.inner.broadcast()
}
pub fn set_qos(&self, qos: u8) -> Result<()> {
self.inner.set_qos(qos)
}
pub fn qos(&self) -> Result<u8> {
self.inner.qos()
}
}
impl AsInner<Socket> for IcmpSocket {
fn as_inner(&self) -> &Socket {
&self.inner
}
}