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)
)
}
}