use core::ffi::{c_char, c_int, c_ushort};
use std::ffi::CString;
const MAX_HOSTNAME_LENGTH: usize = 256;
const WSADATA_MAX_SIZE: usize = 64;
const WSADATA_VERSION: u16 = 0x22;
unsafe extern "C" {
unsafe fn gethostname(name: *mut c_char, namelen: c_int) -> c_int;
unsafe fn WSAStartup(wVersionRequested: c_ushort, lpWSAData: *mut c_char) -> c_int;
}
fn c_wsa_startup() {
let mut dummy_buf: Vec<u8> = vec![0; WSADATA_MAX_SIZE];
unsafe {
let err = WSAStartup(WSADATA_VERSION as c_ushort, dummy_buf.as_mut_ptr() as *mut c_char);
if err != 0 {
panic!("WSAStartup() failed with error {err}");
}
}
}
pub fn c_get_hostname() -> Option<String> {
let res: Option<String>;
c_wsa_startup();
unsafe {
let c_hostname_buf: Vec<u8> = vec![0; MAX_HOSTNAME_LENGTH];
let c_hostname = CString::from_vec_unchecked(c_hostname_buf);
let c_hostname_ptr = c_hostname.into_raw();
if gethostname(c_hostname_ptr as *mut c_char, MAX_HOSTNAME_LENGTH as c_int) != 0 {
return None;
}
res = match CString::from_raw(c_hostname_ptr).into_string() {
Ok(s) => Some(s),
Err(_) => None,
}
}
res
}