diff options
author | Carl Lerche <me@carllerche.com> | 2014-08-17 00:38:05 -0700 |
---|---|---|
committer | Carl Lerche <me@carllerche.com> | 2014-08-17 00:38:05 -0700 |
commit | 86b960d04ce31abd70d4922e364a7e8be1a6d6c5 (patch) | |
tree | 0b1ff24b1b7e8bb0350a668edeec96e6028fb269 /src/sys/utsname.rs | |
parent | 2442e299e80724d813fffa9a11a6fe86227f488b (diff) | |
download | nix-86b960d04ce31abd70d4922e364a7e8be1a6d6c5.zip |
Add uname
Diffstat (limited to 'src/sys/utsname.rs')
-rw-r--r-- | src/sys/utsname.rs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/sys/utsname.rs b/src/sys/utsname.rs new file mode 100644 index 00000000..7414439b --- /dev/null +++ b/src/sys/utsname.rs @@ -0,0 +1,66 @@ +#![cfg(target_os = "linux")] + +use std::mem; +use std::c_str::CString; +use libc::{c_char}; + +mod ffi { + use libc::c_int; + use super::UtsName; + + extern { + pub fn uname(buf: *mut UtsName) -> c_int; + } +} + + +#[cfg(target_arch = "x86_64")] +static UTSNAME_LEN: uint = 65; + +pub struct UtsName { + sysname: [c_char, ..UTSNAME_LEN], + nodename: [c_char, ..UTSNAME_LEN], + release: [c_char, ..UTSNAME_LEN], + version: [c_char, ..UTSNAME_LEN], + machine: [c_char, ..UTSNAME_LEN], + // ifdef _GNU_SOURCE + domainname: [c_char, ..UTSNAME_LEN] +} + +impl UtsName { + pub fn sysname<'a>(&'a self) -> &'a str { + to_str(&self.sysname as *const c_char) + } + + pub fn nodename<'a>(&'a self) -> &'a str { + to_str(&self.nodename as *const c_char) + } + + pub fn release<'a>(&'a self) -> &'a str { + to_str(&self.release as *const c_char) + } + + pub fn version<'a>(&'a self) -> &'a str { + to_str(&self.version as *const c_char) + } + + pub fn machine<'a>(&'a self) -> &'a str { + to_str(&self.machine as *const c_char) + } +} + +pub fn uname() -> UtsName { + unsafe { + let mut ret: UtsName = mem::uninitialized(); + ffi::uname(&mut ret as *mut UtsName); + ret + } +} + +#[inline] +fn to_str<'a>(s: *const c_char) -> &'a str { + unsafe { + let res = CString::new(s, false); + mem::transmute(res.as_str().expect("[BUG] uname field not UTF-8")) + } +} |