@@ -43,14 +43,13 @@ mod address {
43
43
use crate :: net:: socket:: Socket ;
44
44
use crate :: net:: SocketImpl ;
45
45
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 } ;
48
48
use std:: os:: windows:: io:: AsRawSocket ;
49
49
use std:: ptr:: { addr_of_mut, null_mut} ;
50
50
use tracing:: instrument;
51
51
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 ,
54
53
} ;
55
54
56
55
/// Execute a `Win32::NetworkManagement::IpHelper` syscall.
@@ -99,57 +98,6 @@ mod address {
99
98
}
100
99
}
101
100
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
-
153
101
#[ instrument( skip( addr) , ret, level = "trace" ) ]
154
102
pub ( super ) fn lookup_interface_addr ( addr : IpAddr , name : & str ) -> Result < IpAddr > {
155
103
let adapters = match addr {
@@ -170,7 +118,7 @@ mod address {
170
118
171
119
mod adapter {
172
120
use crate :: error:: { Error , Result } ;
173
- use crate :: net :: platform :: windows :: address :: sockaddrptr_to_ipaddr ;
121
+ use socket2 :: SockAddr ;
174
122
use std:: io:: Error as StdIoError ;
175
123
use std:: marker:: PhantomData ;
176
124
use std:: net:: IpAddr ;
@@ -289,7 +237,15 @@ mod address {
289
237
let first_unicast = ( * self . next ) . FirstUnicastAddress ;
290
238
let socket_address = ( * first_unicast) . Address ;
291
239
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 ( )
293
249
} ;
294
250
self . next = ( * self . next ) . Next ;
295
251
Some ( AdapterAddress {
0 commit comments