1use std::ffi::CStr;
4use std::io;
5use std::str::from_utf8;
6
7use std::os::raw::{c_char, c_int};
8
9extern "system" {
10 fn gethostname(name: *mut c_char, len: usize) -> c_int;
11}
12
13pub fn get_hostname() -> io::Result<String> {
15 let mut buf = [0 as c_char; 256];
16 let res = unsafe { gethostname(buf.as_mut_ptr(), buf.len()) };
17
18 match res {
19 -1 => Err(io::Error::last_os_error()),
20 _ => {
21 let s = unsafe { CStr::from_ptr(buf.as_ptr()) };
22 match from_utf8(s.to_bytes()) {
23 Ok(s) => Ok(s.to_owned()),
24 Err(_) => Err(io::Error::new(io::ErrorKind::Other, "invalid hostname")),
25 }
26 }
27 }
28}