Add uname
This commit is contained in:
parent
abe553ba1c
commit
8846c62b5e
@ -41,6 +41,7 @@ mod syscall;
|
||||
mod time;
|
||||
mod util;
|
||||
mod vm;
|
||||
mod misc;
|
||||
|
||||
use prelude::*;
|
||||
|
||||
|
5
src/libos/src/misc/mod.rs
Normal file
5
src/libos/src/misc/mod.rs
Normal file
@ -0,0 +1,5 @@
|
||||
use super::*;
|
||||
|
||||
mod uname;
|
||||
|
||||
pub use self::uname::{utsname_t, do_uname};
|
51
src/libos/src/misc/uname.rs
Normal file
51
src/libos/src/misc/uname.rs
Normal file
@ -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;
|
||||
}
|
||||
|
@ -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::*;
|
||||
|
@ -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<isize, Error> {
|
||||
check_mut_ptr(tidptr)?;
|
||||
process::do_set_tid_address(tidptr).map(|tid| tid as isize)
|
||||
}
|
||||
|
||||
fn do_uname(name: *mut utsname_t) -> Result<isize, Error> {
|
||||
check_mut_ptr(name)?;
|
||||
let name = unsafe { &mut *name };
|
||||
misc::do_uname(name).map(|_| 0)
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
5
test/uname/Makefile
Normal file
5
test/uname/Makefile
Normal file
@ -0,0 +1,5 @@
|
||||
include ../test_common.mk
|
||||
|
||||
EXTRA_C_FLAGS :=
|
||||
EXTRA_LINK_FLAGS :=
|
||||
BIN_ARGS :=
|
14
test/uname/main.c
Normal file
14
test/uname/main.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <sys/utsname.h>
|
||||
#include <stdio.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user