diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 77676c251..9d53cae62 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -18,12 +18,12 @@ utf8 = [] encoding = ["data-encoding"] parse_time = [] utmpx = ["time", "libc"] -c_types = ["libc"] process = ["libc"] signals = [] entries = ["libc"] wide = [] -default = ["fs", "libc", "utf8", "encoding", "parse_time", "utmpx", "c_types", "process", "entries", "signals", "wide"] +utsname = ["libc"] +default = ["fs", "libc", "utf8", "utsname", "encoding", "parse_time", "utmpx", "process", "entries", "signals", "wide"] [lib] path = "lib.rs" diff --git a/src/uucore/lib.rs b/src/uucore/lib.rs index ff45693aa..3a17c886a 100644 --- a/src/uucore/lib.rs +++ b/src/uucore/lib.rs @@ -20,6 +20,8 @@ pub mod parse_time; pub mod utmpx; #[cfg(all(unix, feature = "c_types"))] pub mod c_types; +#[cfg(all(unix, feature = "utsname"))] +pub mod utsname; #[cfg(all(unix, feature = "entries"))] pub mod entries; #[cfg(all(unix, feature = "process"))] diff --git a/src/uucore/utsname.rs b/src/uucore/utsname.rs new file mode 100644 index 000000000..c928c6191 --- /dev/null +++ b/src/uucore/utsname.rs @@ -0,0 +1,52 @@ +// This file is part of the uutils coreutils package. +// +// (c) Jian Zeng +// +// For the full copyright and license information, please view the LICENSE file +// that was distributed with this source code. +// + +use super::libc::{uname, utsname}; +use ::std::mem; +use ::std::ffi::CStr; +use ::std::borrow::Cow; + +macro_rules! cstr2cow { + ($v:expr) => ( + unsafe { CStr::from_ptr($v.as_ref().as_ptr()).to_string_lossy() } + ) +} + +pub struct Uname { + inner: utsname, +} + +impl Uname { + pub fn new() -> Self { + unsafe { + let mut uts: utsname = mem::uninitialized(); + uname(&mut uts); + Uname { inner: uts } + } + } + + pub fn sysname(&self) -> Cow { + cstr2cow!(self.inner.sysname) + } + + pub fn nodename(&self) -> Cow { + cstr2cow!(self.inner.nodename) + } + + pub fn release(&self) -> Cow { + cstr2cow!(self.inner.release) + } + + pub fn version(&self) -> Cow { + cstr2cow!(self.inner.version) + } + + pub fn machine(&self) -> Cow { + cstr2cow!(self.inner.machine) + } +}