@@ -15,15 +15,12 @@ mod libc {
1515    pub  type  socklen_t  = u32 ; 
1616    pub  struct  sockaddr ; 
1717    #[ derive( Clone ) ]  
18-     pub  struct  sockaddr_un ; 
18+     pub  struct  sockaddr_un  { 
19+         pub  sun_path :  [ u8 ;  1 ] , 
20+     } 
1921} 
2022
21- fn  sun_path_offset ( addr :  & libc:: sockaddr_un )  -> usize  { 
22-     // Work with an actual instance of the type since using a null pointer is UB 
23-     let  base = ( addr as  * const  libc:: sockaddr_un ) . addr ( ) ; 
24-     let  path = core:: ptr:: addr_of!( addr. sun_path) . addr ( ) ; 
25-     path - base
26- } 
23+ const  SUN_PATH_OFFSET :  usize  = mem:: offset_of!( libc:: sockaddr_un,  sun_path) ; 
2724
2825pub ( super )  fn  sockaddr_un ( path :  & Path )  -> io:: Result < ( libc:: sockaddr_un ,  libc:: socklen_t ) >  { 
2926    // SAFETY: All zeros is a valid representation for `sockaddr_un`. 
@@ -53,7 +50,7 @@ pub(super) fn sockaddr_un(path: &Path) -> io::Result<(libc::sockaddr_un, libc::s
5350        ptr:: copy_nonoverlapping ( bytes. as_ptr ( ) ,  addr. sun_path . as_mut_ptr ( ) . cast ( ) ,  bytes. len ( ) ) 
5451    } ; 
5552
56-     let  mut  len = sun_path_offset ( & addr )  + bytes. len ( ) ; 
53+     let  mut  len = SUN_PATH_OFFSET  + bytes. len ( ) ; 
5754    match  bytes. get ( 0 )  { 
5855        Some ( & 0 )  | None  => { } 
5956        Some ( _)  => len += 1 , 
@@ -114,13 +111,13 @@ impl SocketAddr {
114111            let  sun_path:  & [ u8 ]  =
115112                unsafe  {  mem:: transmute :: < & [ libc:: c_char ] ,  & [ u8 ] > ( & addr. sun_path )  } ; 
116113            len = core:: slice:: memchr:: memchr ( 0 ,  sun_path) 
117-                 . map_or ( len,  |new_len| ( new_len + sun_path_offset ( & addr ) )  as  libc:: socklen_t ) ; 
114+                 . map_or ( len,  |new_len| ( new_len + SUN_PATH_OFFSET )  as  libc:: socklen_t ) ; 
118115        } 
119116
120117        if  len == 0  { 
121118            // When there is a datagram from unnamed unix socket 
122119            // linux returns zero bytes of address 
123-             len = sun_path_offset ( & addr )  as  libc:: socklen_t ;  // i.e., zero-length address 
120+             len = SUN_PATH_OFFSET  as  libc:: socklen_t ;  // i.e., zero-length address 
124121        }  else  if  addr. sun_family  != libc:: AF_UNIX  as  libc:: sa_family_t  { 
125122            return  Err ( io:: const_io_error!( 
126123                io:: ErrorKind :: InvalidInput , 
@@ -238,7 +235,7 @@ impl SocketAddr {
238235    } 
239236
240237    fn  address ( & self )  -> AddressKind < ' _ >  { 
241-         let  len = self . len  as  usize  - sun_path_offset ( & self . addr ) ; 
238+         let  len = self . len  as  usize  - SUN_PATH_OFFSET ; 
242239        let  path = unsafe  {  mem:: transmute :: < & [ libc:: c_char ] ,  & [ u8 ] > ( & self . addr . sun_path )  } ; 
243240
244241        // macOS seems to return a len of 16 and a zeroed sun_path for unnamed addresses 
@@ -287,7 +284,7 @@ impl linux_ext::addr::SocketAddrExt for SocketAddr {
287284                addr. sun_path . as_mut_ptr ( ) . add ( 1 )  as  * mut  u8 , 
288285                name. len ( ) , 
289286            ) ; 
290-             let  len = ( sun_path_offset ( & addr )  + 1  + name. len ( ) )  as  libc:: socklen_t ; 
287+             let  len = ( SUN_PATH_OFFSET  + 1  + name. len ( ) )  as  libc:: socklen_t ; 
291288            SocketAddr :: from_parts ( addr,  len) 
292289        } 
293290    } 
0 commit comments