Skip to content

Commit 835a8f3

Browse files
seritoolsmbilker
authored andcommitted
Add fallback implementations for getaddrinfo and freeaddrinfo
These fall back to wship6.dll (NT4/2000) if available, or are impl'd via a translation of the header-only wspiapi.h implementations (IPv4 only, all Windows versions).
1 parent 41bd4c8 commit 835a8f3

File tree

4 files changed

+570
-15
lines changed

4 files changed

+570
-15
lines changed

library/std/src/sys/windows/c.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ use core::ffi::NonZero_c_ulong;
1616
mod windows_sys;
1717
pub use windows_sys::*;
1818

19+
#[path = "c/wspiapi.rs"] // c.rs is included from two places so we need to specify this
20+
mod wspiapi;
21+
1922
pub type DWORD = c_ulong;
2023
pub type NonZeroDWORD = NonZero_c_ulong;
2124
pub type LARGE_INTEGER = c_longlong;
@@ -609,6 +612,51 @@ compat_fn_with_fallback! {
609612
}
610613
}
611614

615+
compat_fn_with_fallback! {
616+
pub static WS2_32: &CStr = ansi_str!("ws2_32");
617+
const LOAD: bool = true;
618+
619+
// >= NT4/2000 with IPv6 Tech Preview
620+
pub fn getaddrinfo(
621+
node: *const c_char,
622+
service: *const c_char,
623+
hints: *const ADDRINFOA,
624+
res: *mut *mut ADDRINFOA
625+
) -> c_int {
626+
wship6::getaddrinfo(node, service, hints, res)
627+
}
628+
629+
// >= NT4/2000 with IPv6 Tech Preview
630+
pub fn freeaddrinfo(res: *mut ADDRINFOA) -> () {
631+
wship6::freeaddrinfo(res)
632+
}
633+
}
634+
635+
mod wship6 {
636+
use super::wspiapi::{wspiapi_freeaddrinfo, wspiapi_getaddrinfo};
637+
use super::{c_char, c_int, ADDRINFOA};
638+
639+
compat_fn_with_fallback! {
640+
pub static WSHIP6: &CStr = ansi_str!("wship6");
641+
const LOAD: bool = false;
642+
643+
// >= 2000 with IPv6 Tech Preview
644+
pub fn getaddrinfo(
645+
node: *const c_char,
646+
service: *const c_char,
647+
hints: *const ADDRINFOA,
648+
res: *mut *mut ADDRINFOA
649+
) -> c_int {
650+
wspiapi_getaddrinfo(node, service, hints, res)
651+
}
652+
653+
// >= 2000 with IPv6 Tech Preview
654+
pub fn freeaddrinfo(res: *mut ADDRINFOA) -> () {
655+
wspiapi_freeaddrinfo(res)
656+
}
657+
}
658+
}
659+
612660
#[link(name = "kernel32")]
613661
extern "system" {
614662
pub fn LoadLibraryA(lpFileName: LPCSTR) -> HMODULE;

library/std/src/sys/windows/c/windows_sys.lst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1965,8 +1965,6 @@ Windows.Win32.Networking.WinSock.closesocket
19651965
Windows.Win32.Networking.WinSock.connect
19661966
Windows.Win32.Networking.WinSock.FD_SET
19671967
Windows.Win32.Networking.WinSock.FIONBIO
1968-
Windows.Win32.Networking.WinSock.freeaddrinfo
1969-
Windows.Win32.Networking.WinSock.getaddrinfo
19701968
Windows.Win32.Networking.WinSock.getpeername
19711969
Windows.Win32.Networking.WinSock.getsockname
19721970
Windows.Win32.Networking.WinSock.getsockopt

library/std/src/sys/windows/c/windows_sys.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -605,19 +605,6 @@ extern "system" {
605605
pub fn connect(s: SOCKET, name: *const SOCKADDR, namelen: i32) -> i32;
606606
}
607607
#[link(name = "ws2_32")]
608-
extern "system" {
609-
pub fn freeaddrinfo(paddrinfo: *const ADDRINFOA) -> ();
610-
}
611-
#[link(name = "ws2_32")]
612-
extern "system" {
613-
pub fn getaddrinfo(
614-
pnodename: PCSTR,
615-
pservicename: PCSTR,
616-
phints: *const ADDRINFOA,
617-
ppresult: *mut *mut ADDRINFOA,
618-
) -> i32;
619-
}
620-
#[link(name = "ws2_32")]
621608
extern "system" {
622609
pub fn getpeername(s: SOCKET, name: *mut SOCKADDR, namelen: *mut i32) -> i32;
623610
}

0 commit comments

Comments
 (0)