Address equality method
This commit is contained in:
parent
093b599882
commit
170a81ea3c
@ -1,13 +1,13 @@
|
||||
use std::ffi::{c_char, c_void, OsString};
|
||||
use crate::io::r#abstract::Address;
|
||||
use crate::io::windows::errors::{format_windows_err_code_result, throw_from_windows_err_code};
|
||||
use std::mem::zeroed;
|
||||
use std::ptr;
|
||||
use std::ptr::{copy_nonoverlapping, null, null_mut};
|
||||
use windows::core::{PCWSTR, PWSTR};
|
||||
use windows::Win32::Networking::WinSock::{FreeAddrInfoW, GetAddrInfoW, WSAAddressToStringW, WSAGetLastError, ADDRINFOW, SOCKADDR_STORAGE};
|
||||
use std::ffi::OsString;
|
||||
use std::mem::size_of;
|
||||
use std::mem::zeroed;
|
||||
use std::os::windows::ffi::OsStringExt;
|
||||
use std::ptr::{copy_nonoverlapping, null, null_mut};
|
||||
use std::ptr;
|
||||
use windows::core::{PCWSTR, PWSTR};
|
||||
use windows::Win32::Networking::WinSock::{FreeAddrInfoW, GetAddrInfoW, WSAAddressToStringW, WSAGetLastError, ADDRINFOW, AF_INET, AF_INET6, SOCKADDR_IN, SOCKADDR_IN6, SOCKADDR_STORAGE};
|
||||
|
||||
pub struct WindowsAddress {
|
||||
native: SOCKADDR_STORAGE,
|
||||
@ -19,14 +19,18 @@ impl Address for WindowsAddress {
|
||||
unsafe {
|
||||
let mut p = null_mut::<ADDRINFOW>();
|
||||
|
||||
if (0 != GetAddrInfoW(PCWSTR(encoded.as_slice().as_ptr()), PCWSTR(null()), None, &mut p)) {
|
||||
if (0
|
||||
!= GetAddrInfoW(
|
||||
PCWSTR(encoded.as_slice().as_ptr()),
|
||||
PCWSTR(null()),
|
||||
None,
|
||||
&mut p,
|
||||
))
|
||||
{
|
||||
format_windows_err_code_result(WSAGetLastError())?;
|
||||
}
|
||||
|
||||
let mut this = Self {
|
||||
native: zeroed()
|
||||
};
|
||||
|
||||
let mut this = Self { native: zeroed() };
|
||||
|
||||
copy_nonoverlapping((*p).ai_addr.cast(), &mut this.native, (*p).ai_addrlen);
|
||||
|
||||
@ -39,7 +43,13 @@ impl Address for WindowsAddress {
|
||||
let mut buffer = [0u16; 1024];
|
||||
let mut buf_size = buffer.len() as u32;
|
||||
unsafe {
|
||||
if 0 != WSAAddressToStringW(ptr::from_ref(&self.native).cast(), size_of::<SOCKADDR_STORAGE>() as u32, None, PWSTR(buffer.as_mut_ptr()), &mut buf_size) {
|
||||
if 0 != WSAAddressToStringW(
|
||||
ptr::from_ref(&self.native).cast(),
|
||||
size_of::<SOCKADDR_STORAGE>() as u32,
|
||||
None,
|
||||
PWSTR(buffer.as_mut_ptr()),
|
||||
&mut buf_size,
|
||||
) {
|
||||
throw_from_windows_err_code(WSAGetLastError());
|
||||
}
|
||||
}
|
||||
@ -47,3 +57,26 @@ impl Address for WindowsAddress {
|
||||
return OsString::from_wide(&buffer).to_string_lossy().into_owned();
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq for WindowsAddress {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
match self.native.ss_family {
|
||||
AF_INET => {
|
||||
if other.native.ss_family != AF_INET {
|
||||
return false;
|
||||
}
|
||||
unsafe {
|
||||
let self_4 = *ptr::from_ref(&self.native).cast::<SOCKADDR_IN>();
|
||||
let other_4 = *ptr::from_ref(&other.native).cast::<SOCKADDR_IN>();
|
||||
return self_4.sin_addr.S_un.S_addr == other_4.sin_addr.S_un.S_addr;
|
||||
}
|
||||
}
|
||||
AF_INET6 => unsafe {
|
||||
let self_6 = *ptr::from_ref(&self.native).cast::<SOCKADDR_IN6>();
|
||||
let other_6 = *ptr::from_ref(&other.native).cast::<SOCKADDR_IN6>();
|
||||
return self_6.sin6_addr.u.Word == other_6.sin6_addr.u.Word;
|
||||
}
|
||||
_ => return false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user