use std::{ffi::c_int, fmt, net::Ipv4Addr};
use crate::{IP_DROP_SOURCE_MEMBERSHIP, IPPROTO_IP, LocalFrom, OptWMarker, SockOptMarker, in_addr, ip_mreq_source};
#[repr(transparent)]
#[derive(Clone, Copy)]
pub struct IpDropSourceMembership(ip_mreq_source);
#[cfg(unix)]
impl fmt::Debug for IpDropSourceMembership
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
f.debug_tuple("IpDropSourceMembership").field(&self.0).finish()
}
}
#[cfg(windows)]
impl fmt::Debug for IpDropSourceMembership
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
f.debug_tuple("IpDropSourceMembership").finish()
}
}
impl SockOptMarker for IpDropSourceMembership
{
const SO_LEVEL: c_int = IPPROTO_IP;
const SO_OPTNAME: c_int = IP_DROP_SOURCE_MEMBERSHIP;
type DataType = (Ipv4Addr, Ipv4Addr, Ipv4Addr);
type InputType = ();
#[inline]
fn from(_value: Self::InputType) -> Self
{
panic!("IpDropSourceMembership cannot be read");
}
#[inline]
fn get(self) -> Self::DataType
{
panic!("IpDropSourceMembership cannot be consumed");
}
#[inline]
fn from_user(inp: Self::DataType) -> Self where Self: Sized
{
return Self(
ip_mreq_source
{
imr_multiaddr: <in_addr as LocalFrom<&Ipv4Addr>>::from(&inp.0),
imr_interface: <in_addr as LocalFrom<&Ipv4Addr>>::from(&inp.1),
imr_sourceaddr: <in_addr as LocalFrom<&Ipv4Addr>>::from(&inp.2),
}
);
}
}
impl OptWMarker for IpDropSourceMembership {}