Skip to content

Commit a9266be

Browse files
committed
feat(core): rework address::adapter to use socket2 in windows.rs (WIP)
1 parent bfa4bc7 commit a9266be

File tree

1 file changed

+13
-57
lines changed

1 file changed

+13
-57
lines changed

crates/trippy-core/src/net/platform/windows.rs

+13-57
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)