#![deny(warnings, missing_docs, clippy::all)]
use std::ffi::OsString;
use std::io::Error;
#[cfg(not(windows))]
pub fn gethostname() -> OsString {
use libc::{c_char, sysconf, _SC_HOST_NAME_MAX};
use std::os::unix::ffi::OsStringExt;
let hostname_max = unsafe { sysconf(_SC_HOST_NAME_MAX) };
let mut buffer = vec![0 as u8; (hostname_max as usize) + 1];
let returncode = unsafe { libc::gethostname(buffer.as_mut_ptr() as *mut c_char, buffer.len()) };
if returncode != 0 {
panic!(
"gethostname failed: {}
Please report an issue to <https://github.com/lunaryorn/gethostname.rs/issues>!",
Error::last_os_error()
);
}
let end = buffer
.iter()
.position(|&b| b == 0)
.unwrap_or_else(|| buffer.len());
buffer.resize(end, 0);
OsString::from_vec(buffer)
}
#[cfg(windows)]
pub fn gethostname() -> OsString {
use std::os::windows::ffi::OsStringExt;
use winapi::ctypes::{c_ulong, wchar_t};
use winapi::um::sysinfoapi::{ComputerNamePhysicalDnsHostname, GetComputerNameExW};
let mut buffer_size: c_ulong = 0;
unsafe {
GetComputerNameExW(
ComputerNamePhysicalDnsHostname,
std::ptr::null_mut(),
&mut buffer_size,
)
};
let mut buffer = vec![0 as wchar_t; buffer_size as usize];
let returncode = unsafe {
GetComputerNameExW(
ComputerNamePhysicalDnsHostname,
buffer.as_mut_ptr() as *mut wchar_t,
&mut buffer_size,
)
};
if returncode == 0 {
panic!(
"GetComputerNameExW failed to read hostname: {}
Please report this issue to <https://github.com/lunaryorn/gethostname.rs/issues>!",
Error::last_os_error()
);
}
let end = buffer
.iter()
.position(|&b| b == 0)
.unwrap_or_else(|| buffer.len());
OsString::from_wide(&buffer[0..end])
}
#[cfg(test)]
mod tests {
use pretty_assertions::assert_eq;
use std::process::Command;
#[test]
fn gethostname_matches_system_hostname() {
let output = Command::new("hostname")
.output()
.expect("failed to get hostname");
let hostname = String::from_utf8_lossy(&output.stdout);
assert_eq!(
super::gethostname().into_string().unwrap().to_lowercase(),
hostname.trim_end().to_lowercase()
);
}
#[test]
#[ignore]
fn gethostname_matches_fixed_hostname() {
assert_eq!(
super::gethostname().into_string().unwrap().to_lowercase(),
"hostname-for-testing"
);
}
}