From 170a81ea3c2e324ab81346c1751a8ae9cb06e161 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sun, 1 Mar 2026 00:29:01 +0300 Subject: [PATCH] Address equality method --- src/data2.rs | 0 src/io/windows/address.rs | 57 ++++++++++++++++++++++++++++++--------- 2 files changed, 45 insertions(+), 12 deletions(-) delete mode 100644 src/data2.rs diff --git a/src/data2.rs b/src/data2.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/io/windows/address.rs b/src/io/windows/address.rs index 246d049..4d7e962 100644 --- a/src/io/windows/address.rs +++ b/src/io/windows/address.rs @@ -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::(); - 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::() as u32, None, PWSTR(buffer.as_mut_ptr()), &mut buf_size) { + if 0 != WSAAddressToStringW( + ptr::from_ref(&self.native).cast(), + size_of::() 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::(); + let other_4 = *ptr::from_ref(&other.native).cast::(); + 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::(); + let other_6 = *ptr::from_ref(&other.native).cast::(); + return self_6.sin6_addr.u.Word == other_6.sin6_addr.u.Word; + } + _ => return false, + } + } +}