From 8846c62b5ee0896dc4296db6903a74296a8cb56a Mon Sep 17 00:00:00 2001 From: "Tate, Hongliang Tian" Date: Mon, 8 Apr 2019 23:27:40 +0800 Subject: [PATCH] Add uname --- src/libos/src/lib.rs | 1 + src/libos/src/misc/mod.rs | 5 ++++ src/libos/src/misc/uname.rs | 51 ++++++++++++++++++++++++++++++++++++ src/libos/src/prelude.rs | 1 + src/libos/src/syscall/mod.rs | 9 +++++++ test/Makefile | 2 +- test/uname/Makefile | 5 ++++ test/uname/main.c | 14 ++++++++++ 8 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/libos/src/misc/mod.rs create mode 100644 src/libos/src/misc/uname.rs create mode 100644 test/uname/Makefile create mode 100644 test/uname/main.c diff --git a/src/libos/src/lib.rs b/src/libos/src/lib.rs index 8b3a612d..95d5fe69 100644 --- a/src/libos/src/lib.rs +++ b/src/libos/src/lib.rs @@ -41,6 +41,7 @@ mod syscall; mod time; mod util; mod vm; +mod misc; use prelude::*; diff --git a/src/libos/src/misc/mod.rs b/src/libos/src/misc/mod.rs new file mode 100644 index 00000000..809e7467 --- /dev/null +++ b/src/libos/src/misc/mod.rs @@ -0,0 +1,5 @@ +use super::*; + +mod uname; + +pub use self::uname::{utsname_t, do_uname}; diff --git a/src/libos/src/misc/uname.rs b/src/libos/src/misc/uname.rs new file mode 100644 index 00000000..0b246f45 --- /dev/null +++ b/src/libos/src/misc/uname.rs @@ -0,0 +1,51 @@ +use super::*; +use std::ffi::{CStr, CString}; + +/// A sample of `struct utsname` +/// ``` +/// sysname = Linux +/// nodename = tian-nuc +/// release = 4.15.0-42-generic +/// version = #45~16.04.1-Ubuntu SMP Mon Nov 19 13:02:27 UTC 2018 +/// machine = x86_64 +/// domainname = (none) +/// ``` +/// +/// By the way, UTS stands for UNIX Timesharing System. +#[repr(C)] +#[derive(Copy, Clone)] +pub struct utsname_t { + sysname: [u8; 65], + nodename: [u8; 65], + release: [u8; 65], + version: [u8; 65], + machine: [u8; 65], + domainname: [u8; 65], +} + +pub fn do_uname(name: &mut utsname_t) -> Result<(), Error> { + copy_from_cstr_to_u8_array(&SYSNAME, &mut name.sysname); + copy_from_cstr_to_u8_array(&NODENAME, &mut name.nodename); + copy_from_cstr_to_u8_array(&RELEASE, &mut name.release); + copy_from_cstr_to_u8_array(&VERSION, &mut name.version); + copy_from_cstr_to_u8_array(&MACHINE, &mut name.machine); + copy_from_cstr_to_u8_array(&DOMAINNAME, &mut name.domainname); + Ok(()) +} + +lazy_static! { + static ref SYSNAME : CString = CString::new("Occlum").unwrap(); + static ref NODENAME: CString = CString::new("occlum-node").unwrap(); + static ref RELEASE: CString = CString::new("0.1").unwrap(); + static ref VERSION: CString = CString::new("0.1").unwrap(); + static ref MACHINE: CString = CString::new("x86-64").unwrap(); + static ref DOMAINNAME: CString = CString::new("").unwrap(); +} + +fn copy_from_cstr_to_u8_array(src: &CStr, dst: &mut [u8]) { + let src : &[u8] = src.to_bytes_with_nul(); + let len = min(dst.len() - 1, src.len()); + dst[..len].copy_from_slice(&src[..len]); + dst[len] = 0; +} + diff --git a/src/libos/src/prelude.rs b/src/libos/src/prelude.rs index 2c9708b3..a7057b07 100644 --- a/src/libos/src/prelude.rs +++ b/src/libos/src/prelude.rs @@ -21,6 +21,7 @@ pub use std::iter::Iterator; pub use std::rc::Rc; pub use std::string::String; pub use std::vec::Vec; +pub use std::cmp::{min, max}; pub use errno::Errno; pub use errno::Errno::*; diff --git a/src/libos/src/syscall/mod.rs b/src/libos/src/syscall/mod.rs index a0b392d8..76d41be8 100644 --- a/src/libos/src/syscall/mod.rs +++ b/src/libos/src/syscall/mod.rs @@ -8,6 +8,7 @@ use std::ptr; use time::timeval_t; use util::mem_util::from_user::*; use vm::{VMAreaFlags, VMResizeOptions}; +use misc::{utsname_t}; use super::*; @@ -131,6 +132,8 @@ pub extern "C" fn dispatch_syscall( SYS_GETTIMEOFDAY => do_gettimeofday(arg0 as *mut timeval_t), + SYS_UNAME => do_uname(arg0 as *mut utsname_t), + _ => do_unknown(num, arg0, arg1, arg2, arg3, arg4, arg5), }; debug!("syscall return: {:?}", ret); @@ -696,3 +699,9 @@ fn do_set_tid_address(tidptr: *mut pid_t) -> Result { check_mut_ptr(tidptr)?; process::do_set_tid_address(tidptr).map(|tid| tid as isize) } + +fn do_uname(name: *mut utsname_t) -> Result { + check_mut_ptr(name)?; + let name = unsafe { &mut *name }; + misc::do_uname(name).map(|_| 0) +} diff --git a/test/Makefile b/test/Makefile index 8d698b00..98152f6b 100644 --- a/test/Makefile +++ b/test/Makefile @@ -4,7 +4,7 @@ PROJECT_DIR := $(realpath $(CUR_DIR)/../) # Dependencies: need to be compiled but not to run by any Makefile target TEST_DEPS := dev_null # Tests: need to be compiled and run by test-% target -TESTS := empty argv hello_world malloc file getpid spawn pipe time truncate readdir mkdir link tls pthread +TESTS := empty argv hello_world malloc file getpid spawn pipe time truncate readdir mkdir link tls pthread uname # Benchmarks: need to be compiled and run by bench-% target BENCHES := spawn_and_exit_latency pipe_throughput diff --git a/test/uname/Makefile b/test/uname/Makefile new file mode 100644 index 00000000..9e1b6dec --- /dev/null +++ b/test/uname/Makefile @@ -0,0 +1,5 @@ +include ../test_common.mk + +EXTRA_C_FLAGS := +EXTRA_LINK_FLAGS := +BIN_ARGS := diff --git a/test/uname/main.c b/test/uname/main.c new file mode 100644 index 00000000..18d64e31 --- /dev/null +++ b/test/uname/main.c @@ -0,0 +1,14 @@ +#include +#include + +int main(void) { + struct utsname name; + uname(&name); + printf("sysname = %s\n", (const char*)&name.sysname); + printf("nodename = %s\n", (const char*)&name.nodename); + printf("release = %s\n", (const char*)&name.release); + printf("version = %s\n", (const char*)&name.version); + printf("machine = %s\n", (const char*)&name.machine); + printf("domainname = %s\n", (const char*)&name.__domainname); + return 0; +}