8000 Remove winapi dependency and upgrade windows-sys to 0.59 by arihant2math · Pull Request #5581 · RustPython/RustPython · GitHub
[go: up one dir, main page]

Skip to content

Remove winapi dependency and upgrade windows-sys to 0.59 #5581

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Mar 5, 2025
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 0 additions & 6 deletions stdlib/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,6 @@ paste = { workspace = true }
schannel = { workspace = true }
widestring = { workspace = true }

[target.'cfg(windows)'.dependencies.winapi]
version = "0.3.9"
features = [
"winsock2", "ifdef", "netioapi", "ws2tcpip",
]

[target.'cfg(windows)'.dependencies.windows-sys]
workspace = true
features = [
Expand Down
75 changes: 52 additions & 23 deletions stdlib/src/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,13 @@ mod _socket {
use libc as c;
#[cfg(windows)]
mod c {
pub use winapi::shared::netioapi::{if_indextoname, if_nametoindex};
pub use winapi::shared::ws2def::{
INADDR_ANY, INADDR_BROADCAST, INADDR_LOOPBACK, INADDR_NONE,
};
pub use winapi::um::winsock2::{
SO_EXCLUSIVEADDRUSE, getprotobyname, getservbyname, getservbyport, getsockopt,
setsockopt,
};
pub use winapi::um::ws2tcpip::{
EAI_AGAIN, EAI_BADFLAGS, EAI_FAIL, EAI_FAMILY, EAI_MEMORY, EAI_NODATA, EAI_NONAME,
EAI_SERVICE, EAI_SOCKTYPE,
};
pub use windows_sys::Win32::NetworkManagement::IpHelper::{if_indextoname, if_nametoindex};

pub const INADDR_ANY: u32 = 0x00000000;
pub const INADDR_LOOPBACK: u32 = 0x7f000001;
pub const INADDR_BROADCAST: u32 = 0xffffffff;
pub const INADDR_NONE: u32 = 0xffffffff;

pub use windows_sys::Win32::Networking::WinSock::{
AF_APPLETALK, AF_DECnet, AF_IPX, AF_LINK, AI_ADDRCONFIG, AI_ALL, AI_CANONNAME,
AI_NUMERICSERV, AI_V4MAPPED, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP, IP_HDRINCL,
Expand All @@ -68,6 +63,17 @@ mod _socket {
SOL_SOCKET, SOMAXCONN, TCP_NODELAY, WSAEBADF, WSAECONNRESET, WSAENOTSOCK,
WSAEWOULDBLOCK,
};
pub use windows_sys::Win32::Networking::WinSock::{
SO_REUSEADDR as SO_EXCLUSIVEADDRUSE, getprotobyname, getservbyname, getservbyport,
getsockopt, setsockopt,
};
pub use windows_sys::Win32::Networking::WinSock::{
WSA_NOT_ENOUGH_MEMORY as EAI_MEMORY, WSAEAFNOSUPPORT as EAI_FAMILY,
WSAEINVAL as EAI_BADFLAGS, WSAESOCKTNOSUPPORT as EAI_SOCKTYPE,
WSAHOST_NOT_FOUND as EAI_NODATA, WSAHOST_NOT_FOUND as EAI_NONAME,
WSANO_RECOVERY as EAI_FAIL, WSATRY_AGAIN as EAI_AGAIN,
WSATYPE_NOT_FOUND as EAI_SERVICE,
};
pub const IF_NAMESIZE: usize =
windows_sys::Win32::NetworkManagement::Ndis::IF_MAX_STRING_SIZE as _;
pub const AF_UNSPEC: i32 = windows_sys::Win32::Networking::WinSock::AF_UNSPEC as _;
Expand Down Expand Up @@ -755,7 +761,7 @@ mod _socket {
}

#[cfg(windows)]
use winapi::shared::netioapi;
use windows_sys::Win32::NetworkManagement::IpHelper;

fn get_raw_sock(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<RawSocket> {
#[cfg(unix)]
Expand Down Expand Up @@ -1755,6 +1761,14 @@ mod _socket {
.map(|s| s.to_cstring(vm))
.transpose()?;
let cstr_proto = cstr_opt_as_ptr(&cstr_proto);
#[cfg(windows)]
let serv = unsafe {
c::getservbyname(
cstr_name.as_ptr() as windows_sys::core::PCSTR,
cstr_proto as windows_sys::core::PCSTR,
)
};
#[cfg(not(windows))]
let serv = unsafe { c::getservbyname(cstr_name.as_ptr(), cstr_proto) };
if serv.is_null() {
return Err(vm.new_os_error("service/proto not found".to_owned()));
Expand All @@ -1777,10 +1791,17 @@ mod _socket {
.map(|s| s.to_cstring(vm))
.transpose()?;
let cstr_proto = cstr_opt_as_ptr(&cstr_proto);
#[cfg(windows)]
let serv =
unsafe { c::getservbyport(port.to_be() as _, cstr_proto as windows_sys::core::PCSTR) };
#[cfg(not(windows))]
let serv = unsafe { c::getservbyport(port.to_be() as _, cstr_proto) };
if serv.is_null() {
return Err(vm.new_os_error("port/proto not found".to_owned()));
}
#[cfg(windows)]
let s = unsafe { ffi::CStr::from_ptr((*serv).s_name as *const i8) };
#[cfg(not(windows))]
let s = unsafe { ffi::CStr::from_ptr((*serv).s_name) };
Ok(s.to_string_lossy().into_owned())
}
Expand Down Expand Up @@ -2033,6 +2054,9 @@ mod _socket {
#[pyfunction]
fn getprotobyname(name: PyStrRef, vm: &VirtualMachine) -> PyResult {
let cstr = name.to_cstring(vm)?;
#[cfg(windows)]
let proto = unsafe { c::getprotobyname(cstr.as_ptr() as *const u8) };
#[cfg(not(windows))]
let proto = unsafe { c::getprotobyname(cstr.as_ptr()) };
if proto.is_null() {
return Err(vm.new_os_error("protocol not found".to_owned()));
Expand Down Expand Up @@ -2111,13 +2135,16 @@ mod _socket {
#[cfg(all(unix, not(target_os = "redox")))]
type IfIndex = c::c_uint;
#[cfg(windows)]
type IfIndex = winapi::shared::ifdef::NET_IFINDEX;
type IfIndex = u32;

#[cfg(not(target_os = "redox"))]
#[pyfunction]
fn if_nametoindex(name: FsPath, vm: &VirtualMachine) -> PyResult<IfIndex> {
let name = name.to_cstring(vm)?;

#[cfg(windows)]
let ret = unsafe { c::if_nametoindex(name.as_ptr() as *const u8) };
#[cfg(not(windows))]
let ret = unsafe { c::if_nametoindex(name.as_ptr()) };
if ret == 0 {
Err(vm.new_os_error("no interface with this name".to_owned()))
Expand All @@ -2134,6 +2161,9 @@ mod _socket {
if ret.is_null() {
Err(crate::vm::stdlib::os::errno_err(vm))
} else {
#[cfg(windows)]
let buf = unsafe { ffi::CStr::from_ptr(buf.as_ptr() as *const i8) };
#[cfg(not(windows))]
let buf = unsafe { ffi::CStr::from_ptr(buf.as_ptr()) };
Ok(buf.to_string_lossy().into_owned())
}
Expand Down Expand Up @@ -2170,6 +2200,7 @@ mod _socket {
#[cfg(windows)]
{
use std::ptr;
use windows_sys::Win32::NetworkManagement::Ndis::NET_LUID_LH;

let table = MibTable::get_raw().map_err(|err| err.into_pyexception(vm))?;
let list = table.as_slice().iter().map(|entry| {
Expand All @@ -2181,12 +2212,10 @@ mod _socket {
let list = list.collect::<PyResult<_>>()?;
return Ok(list);

fn get_name(
luid: &winapi::shared::ifdef::NET_LUID,
) -> io::Result<widestring::WideCString> {
fn get_name(luid: &NET_LUID_LH) -> io::Result<widestring::WideCString> {
let mut buf = [0; c::IF_NAMESIZE + 1];
let ret = unsafe {
netioapi::ConvertInterfaceLuidToNameW(luid, buf.as_mut_ptr(), buf.len())
IpHelper::ConvertInterfaceLuidToNameW(luid, buf.as_mut_ptr(), buf.len())
};
if ret == 0 {
Ok(widestring::WideCString::from_ustr_truncate(
Expand All @@ -2197,12 +2226,12 @@ mod _socket {
}
}
struct MibTable {
ptr: ptr::NonNull<netioapi::MIB_IF_TABLE2>,
ptr: ptr::NonNull<IpHelper::MIB_IF_TABLE2>,
}
impl MibTable {
fn get_raw() -> io::Result<Self> {
let mut ptr = ptr::null_mut();
let ret = unsafe { netioapi::GetIfTable2Ex(netioapi::MibIfTableRaw, &mut ptr) };
let ret = unsafe { IpHelper::GetIfTable2Ex(IpHelper::MibIfTableRaw, &mut ptr) };
if ret == 0 {
let ptr = unsafe { ptr::NonNull::new_unchecked(ptr) };
Ok(Self { ptr })
Expand All @@ -2212,17 +2241,17 @@ mod _socket {
}
}
impl MibTable {
fn as_slice(&self) -> &[netioapi::MIB_IF_ROW2] {
fn as_slice(&self) -> &[IpHelper::MIB_IF_ROW2] {
unsafe {
let p = self.ptr.as_ptr();
let ptr = &raw const (*p).Table as *const netioapi::MIB_IF_ROW2;
let ptr = &raw const (*p).Table as *const IpHelper::MIB_IF_ROW2;
std::slice::from_raw_parts(ptr, (*p).NumEntries as usize)
}
}
}
impl Drop for MibTable {
fn drop(&mut self) {
unsafe { netioapi::FreeMibTable(self.ptr.as_ptr() as *mut _) }
unsafe { IpHelper::FreeMibTable(self.ptr.as_ptr() as *mut _) };
}
}
}
Expand Down
Loading
0