1 use crate::backend::c;
2
3 /// The windows `sockaddr_in6` type is a union with accessor functions which
4 /// are not `const fn`. Define our own layout-compatible version so that we
5 /// can transmute in and out of it.
6 #[cfg(windows)]
7 #[repr(C)]
8 struct sockaddr_in6 {
9 sin6_family: u16,
10 sin6_port: u16,
11 sin6_flowinfo: u32,
12 sin6_addr: c::in6_addr,
13 sin6_scope_id: u32,
14 }
15
16 #[cfg(not(windows))]
17 #[inline]
in_addr_s_addr(addr: c::in_addr) -> u3218 pub(crate) const fn in_addr_s_addr(addr: c::in_addr) -> u32 {
19 addr.s_addr
20 }
21
22 #[cfg(windows)]
23 #[inline]
in_addr_s_addr(addr: c::in_addr) -> u3224 pub(crate) const fn in_addr_s_addr(addr: c::in_addr) -> u32 {
25 // This should be `*addr.S_un.S_addr()`, except that isn't a `const fn`.
26 unsafe { core::mem::transmute(addr) }
27 }
28
29 #[cfg(not(windows))]
30 #[inline]
in_addr_new(s_addr: u32) -> c::in_addr31 pub(crate) const fn in_addr_new(s_addr: u32) -> c::in_addr {
32 c::in_addr { s_addr }
33 }
34
35 #[cfg(windows)]
36 #[inline]
in_addr_new(s_addr: u32) -> c::in_addr37 pub(crate) const fn in_addr_new(s_addr: u32) -> c::in_addr {
38 unsafe { core::mem::transmute(s_addr) }
39 }
40
41 #[cfg(not(windows))]
42 #[inline]
in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16]43 pub(crate) const fn in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16] {
44 addr.s6_addr
45 }
46
47 #[cfg(windows)]
48 #[inline]
in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16]49 pub(crate) const fn in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16] {
50 unsafe { core::mem::transmute(addr) }
51 }
52
53 #[cfg(not(windows))]
54 #[inline]
in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr55 pub(crate) const fn in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr {
56 c::in6_addr { s6_addr }
57 }
58
59 #[cfg(windows)]
60 #[inline]
in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr61 pub(crate) const fn in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr {
62 unsafe { core::mem::transmute(s6_addr) }
63 }
64
65 #[cfg(not(windows))]
66 #[inline]
sockaddr_in6_sin6_scope_id(addr: &c::sockaddr_in6) -> u3267 pub(crate) const fn sockaddr_in6_sin6_scope_id(addr: &c::sockaddr_in6) -> u32 {
68 addr.sin6_scope_id
69 }
70
71 #[cfg(windows)]
72 #[inline]
sockaddr_in6_sin6_scope_id(addr: &c::sockaddr_in6) -> u3273 pub(crate) const fn sockaddr_in6_sin6_scope_id(addr: &c::sockaddr_in6) -> u32 {
74 let addr: &sockaddr_in6 = unsafe { core::mem::transmute(addr) };
75 addr.sin6_scope_id
76 }
77
78 #[cfg(not(windows))]
79 #[inline]
sockaddr_in6_new( #[cfg(any( bsd, target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", target_os = "vita" ))] sin6_len: u8, sin6_family: c::sa_family_t, sin6_port: u16, sin6_flowinfo: u32, sin6_addr: c::in6_addr, sin6_scope_id: u32, ) -> c::sockaddr_in680 pub(crate) const fn sockaddr_in6_new(
81 #[cfg(any(
82 bsd,
83 target_os = "aix",
84 target_os = "espidf",
85 target_os = "haiku",
86 target_os = "nto",
87 target_os = "vita"
88 ))]
89 sin6_len: u8,
90 sin6_family: c::sa_family_t,
91 sin6_port: u16,
92 sin6_flowinfo: u32,
93 sin6_addr: c::in6_addr,
94 sin6_scope_id: u32,
95 ) -> c::sockaddr_in6 {
96 c::sockaddr_in6 {
97 #[cfg(any(
98 bsd,
99 target_os = "aix",
100 target_os = "espidf",
101 target_os = "haiku",
102 target_os = "nto",
103 target_os = "vita"
104 ))]
105 sin6_len,
106 sin6_family,
107 sin6_port,
108 sin6_flowinfo,
109 sin6_addr,
110 sin6_scope_id,
111 #[cfg(solarish)]
112 __sin6_src_id: 0,
113 #[cfg(target_os = "vita")]
114 sin6_vport: 0,
115 }
116 }
117
118 #[cfg(windows)]
119 #[inline]
sockaddr_in6_new( sin6_family: u16, sin6_port: u16, sin6_flowinfo: u32, sin6_addr: c::in6_addr, sin6_scope_id: u32, ) -> c::sockaddr_in6120 pub(crate) const fn sockaddr_in6_new(
121 sin6_family: u16,
122 sin6_port: u16,
123 sin6_flowinfo: u32,
124 sin6_addr: c::in6_addr,
125 sin6_scope_id: u32,
126 ) -> c::sockaddr_in6 {
127 let addr = sockaddr_in6 {
128 sin6_family,
129 sin6_port,
130 sin6_flowinfo,
131 sin6_addr,
132 sin6_scope_id,
133 };
134 unsafe { core::mem::transmute(addr) }
135 }
136