summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Lerche <me@carllerche.com>2014-08-17 00:38:05 -0700
committerCarl Lerche <me@carllerche.com>2014-08-17 00:38:05 -0700
commit86b960d04ce31abd70d4922e364a7e8be1a6d6c5 (patch)
tree0b1ff24b1b7e8bb0350a668edeec96e6028fb269 /src
parent2442e299e80724d813fffa9a11a6fe86227f488b (diff)
downloadnix-86b960d04ce31abd70d4922e364a7e8be1a6d6c5.zip
Add uname
Diffstat (limited to 'src')
-rw-r--r--src/sys/mod.rs1
-rw-r--r--src/sys/utsname.rs66
2 files changed, 67 insertions, 0 deletions
diff --git a/src/sys/mod.rs b/src/sys/mod.rs
index 0a741ecf..9d19e35d 100644
--- a/src/sys/mod.rs
+++ b/src/sys/mod.rs
@@ -1,2 +1,3 @@
pub mod epoll;
pub mod stat;
+pub mod utsname;
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"))
+ }
+}