@@ -267,37 +267,27 @@ impl From<SocketAddrV4> for SockAddr {
267
267
268
268
impl From < SocketAddrV6 > for SockAddr {
269
269
fn from ( addr : SocketAddrV6 ) -> SockAddr {
270
- let sockaddr_in6 = sockaddr_in6 {
271
- sin6_family : AF_INET6 as sa_family_t ,
272
- sin6_port : addr. port ( ) . to_be ( ) ,
273
- sin6_addr : crate :: sys:: to_in6_addr ( addr. ip ( ) ) ,
274
- sin6_flowinfo : addr. flowinfo ( ) ,
270
+ // SAFETY: a `sockaddr_storage` of all zeros is valid.
271
+ let mut storage = unsafe { mem:: zeroed :: < sockaddr_storage > ( ) } ;
272
+ let len = {
273
+ let storage = unsafe { & mut * ptr:: addr_of_mut!( storage) . cast :: < sockaddr_in6 > ( ) } ;
274
+ storage. sin6_family = AF_INET6 as sa_family_t ;
275
+ storage. sin6_port = addr. port ( ) . to_be ( ) ;
276
+ storage. sin6_addr = crate :: sys:: to_in6_addr ( addr. ip ( ) ) ;
277
+ storage. sin6_flowinfo = addr. flowinfo ( ) ;
275
278
#[ cfg( unix) ]
276
- sin6_scope_id : addr. scope_id ( ) ,
279
+ {
280
+ storage. sin6_scope_id = addr. scope_id ( ) ;
281
+ }
277
282
#[ cfg( windows) ]
278
- Anonymous : SOCKADDR_IN6_0 {
279
- sin6_scope_id : addr. scope_id ( ) ,
280
- } ,
281
- #[ cfg( any(
282
- target_os = "dragonfly" ,
283
- target_os = "freebsd" ,
284
- target_os = "haiku" ,
285
- target_os = "ios" ,
286
- target_os = "macos" ,
287
- target_os = "netbsd" ,
288
- target_os = "openbsd"
289
- ) ) ]
290
- sin6_len : 0 ,
291
- #[ cfg( any( target_os = "solaris" , target_os = "illumos" ) ) ]
292
- __sin6_src_id : 0 ,
283
+ {
284
+ storage. Anonymous = SOCKADDR_IN6_0 {
285
+ sin6_scope_id : addr. scope_id ( ) ,
286
+ } ;
287
+ }
288
+ mem:: size_of :: < sockaddr_in6 > ( ) as socklen_t
293
289
} ;
294
- let mut storage = MaybeUninit :: < sockaddr_storage > :: zeroed ( ) ;
295
- // Safety: A `sockaddr_in6` is memory compatible with a `sockaddr_storage`
296
- unsafe { ( storage. as_mut_ptr ( ) as * mut sockaddr_in6 ) . write ( sockaddr_in6) } ;
297
- SockAddr {
298
- storage : unsafe { storage. assume_init ( ) } ,
299
- len : mem:: size_of :: < sockaddr_in6 > ( ) as socklen_t ,
300
- }
290
+ SockAddr { storage, len }
301
291
}
302
292
}
303
293
0 commit comments