@@ -21,12 +21,12 @@ use std::{process, ptr, slice};
21
21
22
22
use windows_sys:: Win32 :: Foundation :: { SetHandleInformation , HANDLE , HANDLE_FLAG_INHERIT } ;
23
23
#[ cfg( feature = "all" ) ]
24
- use windows_sys:: Win32 :: Networking :: WinSock :: SO_PROTOCOL_INFOW ;
24
+ use windows_sys:: Win32 :: Networking :: WinSock :: { SO_PROTOCOL_INFOW , SO_ORIGINAL_DST , IP6T_SO_ORIGINAL_DST , SOL_IP } ;
25
25
use windows_sys:: Win32 :: Networking :: WinSock :: {
26
26
self , tcp_keepalive, FIONBIO , IN6_ADDR , IN6_ADDR_0 , INVALID_SOCKET , IN_ADDR , IN_ADDR_0 ,
27
27
POLLERR , POLLHUP , POLLRDNORM , POLLWRNORM , SD_BOTH , SD_RECEIVE , SD_SEND , SIO_KEEPALIVE_VALS ,
28
28
SOCKET_ERROR , WSABUF , WSAEMSGSIZE , WSAESHUTDOWN , WSAPOLLFD , WSAPROTOCOL_INFOW ,
29
- WSA_FLAG_NO_HANDLE_INHERIT , WSA_FLAG_OVERLAPPED ,
29
+ WSA_FLAG_NO_HANDLE_INHERIT , WSA_FLAG_OVERLAPPED
30
30
} ;
31
31
use windows_sys:: Win32 :: System :: Threading :: INFINITE ;
32
32
@@ -77,7 +77,7 @@ pub(crate) use windows_sys::Win32::Networking::WinSock::{
77
77
IP_MREQ_SOURCE as IpMreqSource , IP_MULTICAST_IF , IP_MULTICAST_LOOP , IP_MULTICAST_TTL ,
78
78
IP_RECVTOS , IP_TOS , IP_TTL , LINGER as linger, MSG_OOB , MSG_PEEK , SO_BROADCAST , SO_ERROR ,
79
79
SO_KEEPALIVE , SO_LINGER , SO_OOBINLINE , SO_RCVBUF , SO_RCVTIMEO , SO_REUSEADDR , SO_SNDBUF ,
80
- SO_SNDTIMEO , SO_TYPE , TCP_NODELAY , SO_ORIGINAL_DST , IP6T_SO_ORIGINAL_DST , SOL_IP
80
+ SO_SNDTIMEO , SO_TYPE , TCP_NODELAY
81
81
} ;
82
82
pub ( crate ) const IPPROTO_IP : c_int = windows_sys:: Win32 :: Networking :: WinSock :: IPPROTO_IP as c_int ;
83
83
pub ( crate ) const SOL_SOCKET : c_int = windows_sys:: Win32 :: Networking :: WinSock :: SOL_SOCKET as c_int ;
@@ -929,11 +929,22 @@ impl crate::Socket {
929
929
930
930
/// Get the value for the `SO_ORIGINAL_DST` option on this socket.
931
931
///
932
+ #[ cfg( feature = "all" ) ]
933
+ #[ cfg_attr( docsrs, doc( cfg( all( windows, feature = "all" ) ) ) ) ]
932
934
pub fn original_dst ( & self ) -> io:: Result < SockAddr > {
933
- // Safety: `getsockopt` initialises the `SockAddr` for us.
934
935
unsafe {
935
936
SockAddr :: try_init ( |storage, len| {
936
- getsockopt :: < > ( self . as_raw ( ) , SOL_IP , SO_ORIGINAL_DST )
937
+ syscall ! (
938
+ getsockopt(
939
+ self . as_raw( ) ,
940
+ SOL_IP as i32 ,
941
+ SO_ORIGINAL_DST as i32 ,
942
+ storage. cast( ) ,
943
+ len,
944
+ ) ,
945
+ PartialEq :: eq,
946
+ SOCKET_ERROR
947
+ )
937
948
} )
938
949
}
939
950
. map ( |( _, addr) | addr)
@@ -944,19 +955,11 @@ impl crate::Socket {
944
955
#[ cfg( feature = "all" ) ]
945
956
#[ cfg_attr( docsrs, doc( cfg( all( windows, feature = "all" ) ) ) ) ]
946
957
pub fn original_dst_ipv6 ( & self ) -> io:: Result < SockAddr > {
947
- // Safety: `getsockopt` initialises the `SockAddr` for us.
958
+ use windows_sys:: Win32 :: Networking :: WinSock :: SOL_IPV6 ;
959
+
948
960
unsafe {
949
- SockAddr :: try_init ( |storage, len| {
950
- syscall ! ( getsockopt(
951
- self . as_raw( ) ,
952
- libc:: SOL_IPV6 ,
953
- IP6T_SO_ORIGINAL_DST ,
954
- storage. cast( ) ,
955
- len
956
- ) )
957
- } )
961
+ getsockopt :: < SockAddr > ( self . as_raw ( ) , SOL_IPV6 as i32 , IP6T_SO_ORIGINAL_DST as i32 )
958
962
}
959
- . map ( |( _, addr) | addr)
960
963
}
961
964
962
965
/// Returns the [`Protocol`] of this socket by checking the `SO_PROTOCOL_INFOW`
0 commit comments