@@ -4,15 +4,13 @@ use std::{
4
4
ffi:: CString ,
5
5
io:: { self , Error , ErrorKind } ,
6
6
mem,
7
- net:: { SocketAddr , SocketAddrV4 , SocketAddrV6 } ,
7
+ net:: SocketAddr ,
8
8
ptr,
9
9
} ;
10
10
11
11
use lazy_static:: lazy_static;
12
12
use log:: trace;
13
- use socket2:: Protocol ;
14
-
15
- use crate :: sys:: sockaddr_to_std;
13
+ use socket2:: { Protocol , SockAddr } ;
16
14
17
15
mod ffi {
18
16
use cfg_if:: cfg_if;
@@ -161,7 +159,8 @@ impl PacketFilter {
161
159
SocketAddr :: V4 ( ref v4) => {
162
160
pnl. af = libc:: AF_INET as libc:: sa_family_t ;
163
161
164
- let sockaddr: * const libc:: sockaddr_in = v4 as * const SocketAddrV4 as * const _ ;
162
+ let sockaddr = SockAddr :: from ( * v4) ;
163
+ let sockaddr = sockaddr. as_ptr ( ) as * const libc:: sockaddr_in ;
165
164
166
165
let addr: * const libc:: in_addr = & ( ( * sockaddr) . sin_addr ) as * const _ ;
167
166
let port: libc:: in_port_t = ( * sockaddr) . sin_port ;
@@ -172,7 +171,8 @@ impl PacketFilter {
172
171
SocketAddr :: V6 ( ref v6) => {
173
172
pnl. af = libc:: AF_INET6 as libc:: sa_family_t ;
174
173
175
- let sockaddr: * const libc:: sockaddr_in6 = v6 as * const SocketAddrV6 as * const _ ;
174
+ let sockaddr = SockAddr :: from ( * v6) ;
175
+ let sockaddr = sockaddr. as_ptr ( ) as * const libc:: sockaddr_in6 ;
176
176
177
177
let addr: * const libc:: in6_addr = & ( ( * sockaddr) . sin6_addr ) as * const _ ;
178
178
let port: libc:: in_port_t = ( * sockaddr) . sin6_port ;
@@ -188,7 +188,8 @@ impl PacketFilter {
188
188
return Err ( Error :: new ( ErrorKind :: InvalidInput , "client addr must be ipv4" ) ) ;
189
189
}
190
190
191
- let sockaddr: * const libc:: sockaddr_in = v4 as * const SocketAddrV4 as * const _ ;
191
+ let sockaddr = SockAddr :: from ( * v4) ;
192
+ let sockaddr = sockaddr. as_ptr ( ) as * const libc:: sockaddr_in ;
192
193
193
194
let addr: * const libc:: in_addr = & ( ( * sockaddr) . sin_addr ) as * const _ ;
194
195
let port: libc:: in_port_t = ( * sockaddr) . sin_port ;
@@ -201,7 +202,8 @@ impl PacketFilter {
201
202
return Err ( Error :: new ( ErrorKind :: InvalidInput , "client addr must be ipv6" ) ) ;
202
203
}
203
204
204
- let sockaddr: * const libc:: sockaddr_in6 = v6 as * const SocketAddrV6 as * const _ ;
205
+ let sockaddr = SockAddr :: from ( * v6) ;
206
+ let sockaddr = sockaddr. as_ptr ( ) as * const libc:: sockaddr_in6 ;
205
207
206
208
let addr: * const libc:: in6_addr = & ( ( * sockaddr) . sin6_addr ) as * const _ ;
207
209
let port: libc:: in_port_t = ( * sockaddr) . sin6_port ;
@@ -222,31 +224,35 @@ impl PacketFilter {
222
224
return Err ( nerr) ;
223
225
}
224
226
225
- let mut dst_addr: libc:: sockaddr_storage = mem:: zeroed ( ) ;
226
-
227
- if pnl. af == libc:: AF_INET as libc:: sa_family_t {
228
- let dst_addr: & mut libc:: sockaddr_in = & mut * ( & mut dst_addr as * mut _ as * mut _ ) ;
229
- dst_addr. sin_family = pnl. af ;
230
- dst_addr. sin_port = pnl. rdport ( ) ;
231
- ptr:: copy_nonoverlapping (
232
- & pnl. rdaddr . pfa . v4 ,
233
- & mut dst_addr. sin_addr ,
234
- mem:: size_of_val ( & pnl. rdaddr . pfa . v4 ) ,
235
- ) ;
236
- } else if pnl. af == libc:: AF_INET6 as libc:: sa_family_t {
237
- let dst_addr: & mut libc:: sockaddr_in6 = & mut * ( & mut dst_addr as * mut _ as * mut _ ) ;
238
- dst_addr. sin6_family = pnl. af ;
239
- dst_addr. sin6_port = pnl. rdport ( ) ;
240
- ptr:: copy_nonoverlapping (
241
- & pnl. rdaddr . pfa . v6 ,
242
- & mut dst_addr. sin6_addr ,
243
- mem:: size_of_val ( & pnl. rdaddr . pfa . v6 ) ,
244
- ) ;
245
- } else {
246
- unreachable ! ( "sockaddr should be either ipv4 or ipv6" ) ;
247
- }
227
+ let ( _, dst_addr) = SockAddr :: init ( |dst_addr, addr_len| {
228
+ if pnl. af == libc:: AF_INET as libc:: sa_family_t {
229
+ let dst_addr: & mut libc:: sockaddr_in = & mut * ( dst_addr as * mut _ ) ;
230
+ dst_addr. sin_family = pnl. af ;
231
+ dst_addr. sin_port = pnl. rdport ( ) ;
232
+ ptr:: copy_nonoverlapping (
233
+ & pnl. rdaddr . pfa . v4 ,
234
+ & mut dst_addr. sin_addr ,
235
+ mem:: size_of_val ( & pnl. rdaddr . pfa . v4 ) ,
236
+ ) ;
237
+ * addr_len = mem:: size_of_val ( & pnl. rdaddr . pfa . v4 ) as libc:: socklen_t ;
238
+ } else if pnl. af == libc:: AF_INET6 as libc:: sa_family_t {
239
+ let dst_addr: & mut libc:: sockaddr_in6 = & mut * ( dst_addr as * mut _ ) ;
240
+ dst_addr. sin6_family = pnl. af ;
241
+ dst_addr. sin6_port = pnl. rdport ( ) ;
242
+ ptr:: copy_nonoverlapping (
243
+ & pnl. rdaddr . pfa . v6 ,
244
+ & mut dst_addr. sin6_addr ,
245
+ mem:: size_of_val ( & pnl. rdaddr . pfa . v6 ) ,
246
+ ) ;
247
+ * addr_len = mem:: size_of_val ( & pnl. rdaddr . pfa . v6 ) as libc:: socklen_t ;
248
+ } else {
249
+ unreachable ! ( "sockaddr should be either ipv4 or ipv6" ) ;
250
+ }
251
+
252
+ Ok ( ( ) )
253
+ } ) ?;
248
254
249
- sockaddr_to_std ( & dst_addr)
255
+ Ok ( dst_addr. as_socket ( ) . expect ( "SocketAddr" ) )
250
256
}
251
257
}
252
258
}
0 commit comments