lx 0.4.0

A no_std crate to use Linux system calls
Documentation
use core::fmt::{
    self,
    Display,
    Formatter,
};

use super::{
    SockAddr,
    AF_INET,
    AF_INET6,
};

#[repr(C)]
#[derive(Clone, Copy)]
pub struct SockAddrIn {
    family: u16,
    pub port: u16,
    pub addr: u32,
    zero: [u8; 8],
}

impl SockAddrIn {
    pub fn new(addr: [u8; 4], port: u16) -> Self {
        Self {
            family: AF_INET.into(),
            port: port.to_be(),
            addr: u32::from_ne_bytes(addr),
            zero: [0u8; 8],
        }
    }
}

unsafe impl SockAddr for SockAddrIn {
    fn family() -> u8 {
        AF_INET
    }
}

impl Display for SockAddrIn {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        let parts = self.addr.to_ne_bytes();
        write!(
            f,
            "{}.{}.{}.{}:{}",
            parts[0],
            parts[1],
            parts[2],
            parts[3],
            u16::from_be(self.port)
        )
    }
}

#[repr(C)]
#[derive(Clone, Copy)]
pub struct SockAddrIn6 {
    family: u16,
    pub port: u16,
    pub flowinfo: u32,
    pub addr: [u16; 8],
    pub scope_id: u32,
}

impl SockAddrIn6 {
    pub fn new(addr: [u16; 8], port: u16) -> Self {
        Self {
            family: AF_INET6.into(),
            flowinfo: 0,
            port: port.to_be(),
            addr,
            scope_id: 0,
        }
    }
}

unsafe impl SockAddr for SockAddrIn6 {
    fn family() -> u8 {
        AF_INET6
    }
}

impl Display for SockAddrIn6 {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(
            f,
            "[{:x}:{:x}:{:x}:{:x}:{:x}:{:x}:{:x}:{:x}]:{}",
            self.addr[0],
            self.addr[1],
            self.addr[2],
            self.addr[3],
            self.addr[4],
            self.addr[5],
            self.addr[6],
            self.addr[7],
            u16::from_be(self.port)
        )
    }
}