@@ -43,14 +43,13 @@ mod address {
4343 use crate :: net:: socket:: Socket ;
4444 use crate :: net:: SocketImpl ;
4545 use socket2:: SockAddr ;
46- use std:: io:: { Error as StdIoError , ErrorKind as StdErrorKind , Result as StdIoResult } ;
47- use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr , SocketAddrV4 , SocketAddrV6 } ;
46+ use std:: io:: Error as StdIoError ;
47+ use std:: net:: { IpAddr , Ipv4Addr , SocketAddr } ;
4848 use std:: os:: windows:: io:: AsRawSocket ;
4949 use std:: ptr:: { addr_of_mut, null_mut} ;
5050 use tracing:: instrument;
5151 use windows_sys:: Win32 :: Networking :: WinSock :: {
52- AF_INET , AF_INET6 , SIO_ROUTING_INTERFACE_QUERY , SOCKADDR_IN , SOCKADDR_IN6 ,
53- SOCKADDR_STORAGE , SOCKET_ERROR ,
52+ SIO_ROUTING_INTERFACE_QUERY , SOCKADDR_STORAGE , SOCKET_ERROR ,
5453 } ;
5554
5655 /// Execute a `Win32::NetworkManagement::IpHelper` syscall.
@@ -99,57 +98,6 @@ mod address {
9998 }
10099 }
101100
102- #[ allow( unsafe_code) ]
103- fn sockaddrptr_to_ipaddr ( sockaddr : * mut SOCKADDR_STORAGE ) -> StdIoResult < IpAddr > {
104- // Safety: TODO
105- match sockaddr_to_socketaddr ( unsafe { sockaddr. as_ref ( ) . unwrap ( ) } ) {
106- Err ( e) => Err ( e) ,
107- Ok ( socketaddr) => match socketaddr {
108- SocketAddr :: V4 ( socketaddrv4) => Ok ( IpAddr :: V4 ( * socketaddrv4. ip ( ) ) ) ,
109- SocketAddr :: V6 ( socketaddrv6) => Ok ( IpAddr :: V6 ( * socketaddrv6. ip ( ) ) ) ,
110- } ,
111- }
112- }
113-
114- #[ allow( unsafe_code) ]
115- fn sockaddr_to_socketaddr ( sockaddr : & SOCKADDR_STORAGE ) -> StdIoResult < SocketAddr > {
116- let ptr = sockaddr as * const SOCKADDR_STORAGE ;
117- let af = sockaddr. ss_family ;
118- if af == AF_INET {
119- let sockaddr_in_ptr = ptr. cast :: < SOCKADDR_IN > ( ) ;
120- // Safety: TODO
121- let sockaddr_in = unsafe { * sockaddr_in_ptr } ;
122- let ipv4addr = u32:: from_be ( unsafe { sockaddr_in. sin_addr . S_un . S_addr } ) ;
123- let port = sockaddr_in. sin_port ;
124- Ok ( SocketAddr :: V4 ( SocketAddrV4 :: new (
125- Ipv4Addr :: from ( ipv4addr) ,
126- port,
127- ) ) )
128- } else if af == AF_INET6 {
129- #[ allow( clippy:: cast_ptr_alignment) ]
130- let sockaddr_in6_ptr = ptr. cast :: < SOCKADDR_IN6 > ( ) ;
131- // Safety: TODO
132- let sockaddr_in6 = unsafe { * sockaddr_in6_ptr } ;
133- // TODO: check endianness
134- // Safety: TODO
135- let ipv6addr = unsafe { sockaddr_in6. sin6_addr . u . Byte } ;
136- let port = sockaddr_in6. sin6_port ;
137- // Safety: TODO
138- let scope_id = unsafe { sockaddr_in6. Anonymous . sin6_scope_id } ;
139- Ok ( SocketAddr :: V6 ( SocketAddrV6 :: new (
140- Ipv6Addr :: from ( ipv6addr) ,
141- port,
142- sockaddr_in6. sin6_flowinfo ,
143- scope_id,
144- ) ) )
145- } else {
146- Err ( StdIoError :: new (
147- StdErrorKind :: Unsupported ,
148- format ! ( "Unsupported address family: {af:?}" ) ,
149- ) )
150- }
151- }
152-
153101 #[ instrument( skip( addr) , ret, level = "trace" ) ]
154102 pub ( super ) fn lookup_interface_addr ( addr : IpAddr , name : & str ) -> Result < IpAddr > {
155103 let adapters = match addr {
@@ -170,7 +118,7 @@ mod address {
170118
171119 mod adapter {
172120 use crate :: error:: { Error , Result } ;
173- use crate :: net :: platform :: windows :: address :: sockaddrptr_to_ipaddr ;
121+ use socket2 :: SockAddr ;
174122 use std:: io:: Error as StdIoError ;
175123 use std:: marker:: PhantomData ;
176124 use std:: net:: IpAddr ;
@@ -289,7 +237,15 @@ mod address {
289237 let first_unicast = ( * self . next ) . FirstUnicastAddress ;
290238 let socket_address = ( * first_unicast) . Address ;
291239 let sockaddr = socket_address. lpSockaddr ;
292- sockaddrptr_to_ipaddr ( sockaddr. cast ( ) ) . ok ( ) ?
240+
241+ // Safety: TODO
242+ let ( ( ) , addr) = SockAddr :: try_init ( |s, _length| {
243+ // TODO or `memcpy`?
244+ * s = * sockaddr. cast ( ) ;
245+ Ok ( ( ) )
246+ } )
247+ . unwrap ( ) ;
248+ addr. as_socket ( ) . unwrap ( ) . ip ( )
293249 } ;
294250 self . next = ( * self . next ) . Next ;
295251 Some ( AdapterAddress {
0 commit comments