• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use super::super::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(not(feature = "std"))]
23 #[cfg(windows)]
24 #[inline]
in_addr_s_addr(addr: c::in_addr) -> u3225 pub(crate) const fn in_addr_s_addr(addr: c::in_addr) -> u32 {
26     // This should be `*addr.S_un.S_addr()`, except that isn't a `const fn`.
27     unsafe { core::mem::transmute(addr) }
28 }
29 
30 // TODO: With Rust 1.55, we can use the above `in_addr_s_addr` definition that
31 // uses a const-fn transmute.
32 #[cfg(feature = "std")]
33 #[cfg(windows)]
34 #[inline]
in_addr_s_addr(addr: c::in_addr) -> u3235 pub(crate) fn in_addr_s_addr(addr: c::in_addr) -> u32 {
36     // This should be `*addr.S_un.S_addr()`, except that isn't a `const fn`.
37     unsafe { core::mem::transmute(addr) }
38 }
39 
40 #[cfg(not(windows))]
41 #[inline]
in_addr_new(s_addr: u32) -> c::in_addr42 pub(crate) const fn in_addr_new(s_addr: u32) -> c::in_addr {
43     c::in_addr { s_addr }
44 }
45 
46 #[cfg(not(feature = "std"))]
47 #[cfg(windows)]
48 #[inline]
in_addr_new(s_addr: u32) -> c::in_addr49 pub(crate) const fn in_addr_new(s_addr: u32) -> c::in_addr {
50     unsafe { core::mem::transmute(s_addr) }
51 }
52 
53 // TODO: With Rust 1.55, we can use the above `in_addr_new` definition that
54 // uses a const-fn transmute.
55 #[cfg(feature = "std")]
56 #[cfg(windows)]
57 #[inline]
in_addr_new(s_addr: u32) -> c::in_addr58 pub(crate) fn in_addr_new(s_addr: u32) -> c::in_addr {
59     unsafe { core::mem::transmute(s_addr) }
60 }
61 
62 #[cfg(not(windows))]
63 #[inline]
in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16]64 pub(crate) const fn in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16] {
65     addr.s6_addr
66 }
67 
68 #[cfg(not(feature = "std"))]
69 #[cfg(windows)]
70 #[inline]
in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16]71 pub(crate) const fn in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16] {
72     unsafe { core::mem::transmute(addr) }
73 }
74 
75 // TODO: With Rust 1.55, we can use the above `in6_addr_s6_addr` definition
76 // that uses a const-fn transmute.
77 #[cfg(feature = "std")]
78 #[cfg(windows)]
79 #[inline]
in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16]80 pub(crate) fn in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16] {
81     unsafe { core::mem::transmute(addr) }
82 }
83 
84 #[cfg(not(windows))]
85 #[inline]
in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr86 pub(crate) const fn in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr {
87     c::in6_addr { s6_addr }
88 }
89 
90 #[cfg(not(feature = "std"))]
91 #[cfg(windows)]
92 #[inline]
in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr93 pub(crate) const fn in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr {
94     unsafe { core::mem::transmute(s6_addr) }
95 }
96 
97 // TODO: With Rust 1.55, we can use the above `in6_addr_new` definition that
98 // uses a const-fn transmute.
99 #[cfg(feature = "std")]
100 #[cfg(windows)]
101 #[inline]
in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr102 pub(crate) fn in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr {
103     unsafe { core::mem::transmute(s6_addr) }
104 }
105 
106 #[cfg(not(windows))]
107 #[inline]
sockaddr_in6_sin6_scope_id(addr: c::sockaddr_in6) -> u32108 pub(crate) const fn sockaddr_in6_sin6_scope_id(addr: c::sockaddr_in6) -> u32 {
109     addr.sin6_scope_id
110 }
111 
112 #[cfg(not(feature = "std"))]
113 #[cfg(windows)]
114 #[inline]
sockaddr_in6_sin6_scope_id(addr: c::sockaddr_in6) -> u32115 pub(crate) const fn sockaddr_in6_sin6_scope_id(addr: c::sockaddr_in6) -> u32 {
116     let addr: sockaddr_in6 = unsafe { core::mem::transmute(addr) };
117     addr.sin6_scope_id
118 }
119 
120 // TODO: With Rust 1.55, we can use the above `sockaddr_in6_sin6_scope_id`
121 // definition that uses a const-fn transmute.
122 #[cfg(feature = "std")]
123 #[cfg(windows)]
124 #[inline]
sockaddr_in6_sin6_scope_id(addr: c::sockaddr_in6) -> u32125 pub(crate) fn sockaddr_in6_sin6_scope_id(addr: c::sockaddr_in6) -> u32 {
126     let addr: sockaddr_in6 = unsafe { core::mem::transmute(addr) };
127     addr.sin6_scope_id
128 }
129 
130 #[cfg(not(windows))]
131 #[inline]
sockaddr_in6_new( #[cfg(any( target_os = "dragonfly", target_os = "freebsd", target_os = "haiku", target_os = "ios", target_os = "macos", target_os = "netbsd", target_os = "openbsd", ))] 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_in6132 pub(crate) const fn sockaddr_in6_new(
133     #[cfg(any(
134         target_os = "dragonfly",
135         target_os = "freebsd",
136         target_os = "haiku",
137         target_os = "ios",
138         target_os = "macos",
139         target_os = "netbsd",
140         target_os = "openbsd",
141     ))]
142     sin6_len: u8,
143     sin6_family: c::sa_family_t,
144     sin6_port: u16,
145     sin6_flowinfo: u32,
146     sin6_addr: c::in6_addr,
147     sin6_scope_id: u32,
148 ) -> c::sockaddr_in6 {
149     c::sockaddr_in6 {
150         #[cfg(any(
151             target_os = "dragonfly",
152             target_os = "freebsd",
153             target_os = "haiku",
154             target_os = "ios",
155             target_os = "macos",
156             target_os = "netbsd",
157             target_os = "openbsd",
158         ))]
159         sin6_len,
160         sin6_family,
161         sin6_port,
162         sin6_flowinfo,
163         sin6_addr,
164         sin6_scope_id,
165         #[cfg(any(target_os = "illumos", target_os = "solaris"))]
166         __sin6_src_id: 0,
167     }
168 }
169 
170 #[cfg(not(feature = "std"))]
171 #[cfg(windows)]
172 #[inline]
sockaddr_in6_new( sin6_family: u16, sin6_port: u16, sin6_flowinfo: u32, sin6_addr: c::in6_addr, sin6_scope_id: u32, ) -> c::sockaddr_in6173 pub(crate) const fn sockaddr_in6_new(
174     sin6_family: u16,
175     sin6_port: u16,
176     sin6_flowinfo: u32,
177     sin6_addr: c::in6_addr,
178     sin6_scope_id: u32,
179 ) -> c::sockaddr_in6 {
180     let addr = sockaddr_in6 {
181         sin6_family,
182         sin6_port,
183         sin6_flowinfo,
184         sin6_addr,
185         sin6_scope_id,
186     };
187     unsafe { core::mem::transmute(addr) }
188 }
189 
190 // TODO: With Rust 1.55, we can use the above `sockaddr_in6_new` definition
191 // that uses a const-fn transmute.
192 #[cfg(feature = "std")]
193 #[cfg(windows)]
194 #[inline]
sockaddr_in6_new( sin6_family: u16, sin6_port: u16, sin6_flowinfo: u32, sin6_addr: c::in6_addr, sin6_scope_id: u32, ) -> c::sockaddr_in6195 pub(crate) fn sockaddr_in6_new(
196     sin6_family: u16,
197     sin6_port: u16,
198     sin6_flowinfo: u32,
199     sin6_addr: c::in6_addr,
200     sin6_scope_id: u32,
201 ) -> c::sockaddr_in6 {
202     let addr = sockaddr_in6 {
203         sin6_family,
204         sin6_port,
205         sin6_flowinfo,
206         sin6_addr,
207         sin6_scope_id,
208     };
209     unsafe { core::mem::transmute(addr) }
210 }
211