1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
extern crate libc; use std::io; use std::ffi::CStr; use libc::{utsname, c_char}; #[derive(Debug)] pub struct Info { pub sysname: String, pub nodename: String, pub release: String, pub version: String, pub machine: String, _priv: (), } impl Info { pub fn new() -> io::Result<Self> { let mut n = unsafe { std::mem::zeroed() }; let r = unsafe { libc::uname(&mut n) }; if r == 0 { Ok(From::from(n)) } else { Err(io::Error::last_os_error()) } } } #[inline] fn to_cstr(buf: &[c_char]) -> &CStr { unsafe { CStr::from_ptr(buf.as_ptr()) } } impl From<utsname> for Info { fn from(x: utsname) -> Self { Info { sysname: to_cstr(&x.sysname[..]).to_string_lossy().into_owned(), nodename: to_cstr(&x.nodename[..]).to_string_lossy().into_owned(), release: to_cstr(&x.release[..]).to_string_lossy().into_owned(), version: to_cstr(&x.version[..]).to_string_lossy().into_owned(), machine: to_cstr(&x.machine[..]).to_string_lossy().into_owned(), _priv: (), } } } pub fn uname() -> io::Result<Info> { Info::new() }