Safe way to call WSACleanup
This commit is contained in:
parent
d3c4e684ff
commit
5dc2ba2dca
56
network/windows/src/entry_point.rs
Normal file
56
network/windows/src/entry_point.rs
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
use super::errors::throw_from_windows_err_code;
|
||||||
|
use std::mem::uninitialized;
|
||||||
|
use windows::Win32::Networking::WinSock::{
|
||||||
|
SOCKET_ERROR, WSACleanup, WSADATA, WSAGetLastError, WSAStartup,
|
||||||
|
};
|
||||||
|
use bgtu_networks_2_network_abstract::NetworkScope;
|
||||||
|
|
||||||
|
struct WinSocksDefer {}
|
||||||
|
|
||||||
|
impl WinSocksDefer {
|
||||||
|
fn startup(expected_version: (u8, u8)) -> Self {
|
||||||
|
unsafe {
|
||||||
|
let mut data = uninitialized::<WSADATA>();
|
||||||
|
let expected_version_packed =
|
||||||
|
((expected_version.1 as u16) << 8) | (expected_version.0 as u16);
|
||||||
|
match WSAStartup(expected_version_packed, &mut data) {
|
||||||
|
0 => {}
|
||||||
|
errcode => throw_from_windows_err_code(errcode),
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.wVersion != expected_version_packed {
|
||||||
|
panic!(
|
||||||
|
"WinSocks doesn't supports requested version {}.{}, maximum supported is {}.{}, current {}.{}",
|
||||||
|
expected_version.0,
|
||||||
|
expected_version.1,
|
||||||
|
data.wHighVersion & 0xFF,
|
||||||
|
data.wHighVersion >> 8,
|
||||||
|
data.wVersion & 0xFF,
|
||||||
|
data.wVersion >> 8
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Self {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for WinSocksDefer {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe {
|
||||||
|
match WSACleanup() {
|
||||||
|
0 => {}
|
||||||
|
SOCKET_ERROR => throw_from_windows_err_code(WSAGetLastError()),
|
||||||
|
ret => panic!("Unexpected return value of `WSACleanup()`: {ret}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub fn winsocks_scope_2_2<R>(scope: impl NetworkScope) -> R {
|
||||||
|
let ws = WinSocksDefer::startup((2,2));
|
||||||
|
scope.run(todo!());
|
||||||
|
let _ = ws;
|
||||||
|
}
|
||||||
@ -3,4 +3,6 @@ mod errors;
|
|||||||
mod task;
|
mod task;
|
||||||
mod eventloop;
|
mod eventloop;
|
||||||
mod allocator;
|
mod allocator;
|
||||||
mod winsocks_scope;
|
mod entry_point;
|
||||||
|
|
||||||
|
pub use entry_point::winsocks_scope_2_2;
|
||||||
@ -1,21 +0,0 @@
|
|||||||
use super::errors::throw_from_windows_err_code;
|
|
||||||
use std::mem::uninitialized;
|
|
||||||
use windows::Win32::Networking::WinSock::{WSACleanup, WSAStartup};
|
|
||||||
|
|
||||||
pub(in crate) fn winsocks_scope<R>(scope: impl FnOnce() -> R) -> R {
|
|
||||||
unsafe {
|
|
||||||
match WSAStartup(0x0202, &mut uninitialized()) {
|
|
||||||
0 => {}
|
|
||||||
errcode => throw_from_windows_err_code(errcode),
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = scope();
|
|
||||||
|
|
||||||
match WSACleanup() {
|
|
||||||
0 => {}
|
|
||||||
errcode => throw_from_windows_err_code(errcode),
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user