1use core::fmt::{
2 self,
3 Display,
4 Formatter,
5};
6
7use super::{
8 SockAddr,
9 AF_INET,
10 AF_INET6,
11};
12
13#[repr(C)]
14#[derive(Clone, Copy)]
15pub struct SockAddrIn {
16 family: u16,
17 pub port: u16,
18 pub addr: u32,
19 zero: [u8; 8],
20}
21
22impl SockAddrIn {
23 pub fn new(addr: [u8; 4], port: u16) -> Self {
24 Self {
25 family: AF_INET.into(),
26 port: port.to_be(),
27 addr: u32::from_ne_bytes(addr),
28 zero: [0u8; 8],
29 }
30 }
31}
32
33unsafe impl SockAddr for SockAddrIn {
34 fn family() -> u8 {
35 AF_INET
36 }
37}
38
39impl Display for SockAddrIn {
40 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
41 let parts = self.addr.to_ne_bytes();
42 write!(
43 f,
44 "{}.{}.{}.{}:{}",
45 parts[0],
46 parts[1],
47 parts[2],
48 parts[3],
49 u16::from_be(self.port)
50 )
51 }
52}
53
54#[repr(C)]
55#[derive(Clone, Copy)]
56pub struct SockAddrIn6 {
57 family: u16,
58 pub port: u16,
59 pub flowinfo: u32,
60 pub addr: [u16; 8],
61 pub scope_id: u32,
62}
63
64impl SockAddrIn6 {
65 pub fn new(addr: [u16; 8], port: u16) -> Self {
66 Self {
67 family: AF_INET6.into(),
68 flowinfo: 0,
69 port: port.to_be(),
70 addr,
71 scope_id: 0,
72 }
73 }
74}
75
76unsafe impl SockAddr for SockAddrIn6 {
77 fn family() -> u8 {
78 AF_INET6
79 }
80}
81
82impl Display for SockAddrIn6 {
83 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
84 write!(
85 f,
86 "[{:x}:{:x}:{:x}:{:x}:{:x}:{:x}:{:x}:{:x}]:{}",
87 self.addr[0],
88 self.addr[1],
89 self.addr[2],
90 self.addr[3],
91 self.addr[4],
92 self.addr[5],
93 self.addr[6],
94 self.addr[7],
95 u16::from_be(self.port)
96 )
97 }
98}