socket9 0.1.0-alpha.1

Extended untilities for the networking/unix sockets and raw network sockets
Documentation
/*-
 * socket9 - A RAW networking sockets manipulation and configration basing on 
 * strong types.
 * 
 * Copyright (C) 2021 Aleksandr Morozov, Lucia Hoffmann
 * Copyright (C) 2025 Aleksandr Morozov
 * 
 * The syslog-rs crate can be redistributed and/or modified
 * under the terms of either of the following licenses:
 *
 *   1. EUROPEAN UNION PUBLIC LICENCE v. 1.2 EUPL © the European Union 2007, 2016 OR
 *
 *   2. the Mozilla Public License Version 2.0 (the “MPL”) OR
 *                     
 *   3. The MIT License (MIT)
 */

 
use std::{ffi::c_int, fmt, net::Ipv4Addr};

use crate::{IP_ADD_SOURCE_MEMBERSHIP, IPPROTO_IP, LocalFrom, OptWMarker, SockOptMarker, in_addr, ip_mreq_source};


#[repr(transparent)]
#[derive(Clone, Copy)]
pub struct IpAddSourceMembership(ip_mreq_source);

#[cfg(unix)]
impl fmt::Debug for IpAddSourceMembership
{
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result 
    {
        f.debug_tuple("IpAddSourceMembership").field(&self.0).finish()
    }
}

#[cfg(windows)]
impl fmt::Debug for IpAddSourceMembership
{
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result 
    {
        f.debug_tuple("IpAddSourceMembership").finish()
    }
}

impl SockOptMarker for IpAddSourceMembership
{
    const SO_LEVEL: c_int = IPPROTO_IP;   
    const SO_OPTNAME: c_int = IP_ADD_SOURCE_MEMBERSHIP;

    /// (imr_multiaddr, imr_interface, imr_sourceaddr)
    type DataType = (Ipv4Addr, Ipv4Addr, Ipv4Addr);
    type InputType = ();

    #[inline]
    fn from(_value: Self::InputType) -> Self 
    {
        panic!("IpAddSourceMembership cannot be read");
    }

    #[inline]
    fn get(self) -> Self::DataType
    {
        panic!("IpAddSourceMembership 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 IpAddSourceMembership {}