From f82b48b8395b9a0062ce94e511e50c35841b2a06 Mon Sep 17 00:00:00 2001 From: jD91mZM2 Date: Sun, 29 Jul 2018 09:23:56 +0200 Subject: [PATCH] Implement sys/times.h on linux --- Cargo.lock | 9 +++++++++ Cargo.toml | 1 + src/lib.rs | 1 + src/platform/src/linux/mod.rs | 4 ++++ src/platform/src/redox/mod.rs | 9 +++++++++ src/platform/src/types.rs | 8 ++++++++ src/sys_times/Cargo.toml | 10 ++++++++++ src/sys_times/build.rs | 11 +++++++++++ src/sys_times/cbindgen.toml | 6 ++++++ src/sys_times/src/lib.rs | 20 ++++++++++++++++++++ tests/.gitignore | 1 + tests/Makefile | 1 + tests/time/times.c | 13 +++++++++++++ 13 files changed, 94 insertions(+) create mode 100644 src/sys_times/Cargo.toml create mode 100644 src/sys_times/build.rs create mode 100644 src/sys_times/cbindgen.toml create mode 100644 src/sys_times/src/lib.rs create mode 100644 tests/time/times.c diff --git a/Cargo.lock b/Cargo.lock index a0505d021c..7218781286 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -349,6 +349,7 @@ dependencies = [ "sys_socket 0.1.0", "sys_stat 0.1.0", "sys_time 0.1.0", + "sys_times 0.1.0", "sys_un 0.1.0", "sys_utsname 0.1.0", "sys_wait 0.1.0", @@ -579,6 +580,14 @@ dependencies = [ "platform 0.1.0", ] +[[package]] +name = "sys_times" +version = "0.1.0" +dependencies = [ + "cbindgen 0.5.2", + "platform 0.1.0", +] + [[package]] name = "sys_un" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index ea17f15004..77643812b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,7 @@ sys_resource = { path = "src/sys_resource" } sys_socket = { path = "src/sys_socket" } sys_stat = { path = "src/sys_stat" } sys_time = { path = "src/sys_time" } +sys_times = { path = "src/sys_times" } sys_un = { path = "src/sys_un" } sys_utsname = { path = "src/sys_utsname" } sys_wait = { path = "src/sys_wait" } diff --git a/src/lib.rs b/src/lib.rs index 8e752a8446..65e556ac68 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -31,6 +31,7 @@ pub extern crate sys_resource; pub extern crate sys_socket; pub extern crate sys_stat; pub extern crate sys_time; +pub extern crate sys_times; pub extern crate sys_un; pub extern crate sys_utsname; pub extern crate sys_wait; diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs index 790b87ec67..8003b7f27b 100644 --- a/src/platform/src/linux/mod.rs +++ b/src/platform/src/linux/mod.rs @@ -392,6 +392,10 @@ pub fn socketpair(domain: c_int, kind: c_int, protocol: c_int, socket_vector: *m e(unsafe { syscall!(SOCKETPAIR, domain, kind, protocol, socket_vector) }) as c_int } +pub fn times(out: *mut tms) -> clock_t { + unsafe { syscall!(TIMES, out) as clock_t } +} + pub fn uname(utsname: *mut utsname) -> c_int { e(unsafe { syscall!(UNAME, utsname, 0) }) as c_int } diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs index 3619d499ea..099f2fd1cb 100644 --- a/src/platform/src/redox/mod.rs +++ b/src/platform/src/redox/mod.rs @@ -821,6 +821,15 @@ pub fn socketpair(domain: c_int, kind: c_int, protocol: c_int, socket_vector: *m -1 } +pub fn times(out: *mut tms) -> clock_t { + let _ = write!( + ::FileWriter(2), + "unimplemented: times({:p})", + out + ); + !0 +} + pub fn unlink(path: *const c_char) -> c_int { let path = unsafe { c_str(path) }; e(syscall::unlink(path)) as c_int diff --git a/src/platform/src/types.rs b/src/platform/src/types.rs index 8438ddf10c..eaa7d18cd1 100644 --- a/src/platform/src/types.rs +++ b/src/platform/src/types.rs @@ -223,3 +223,11 @@ pub struct rusage { pub ru_nvcsw: c_long, pub ru_nivcsw: c_long } + +#[repr(C)] +pub struct tms { + tms_utime: clock_t, + tms_stime: clock_t, + tms_cutime: clock_t, + tms_cstime: clock_t +} diff --git a/src/sys_times/Cargo.toml b/src/sys_times/Cargo.toml new file mode 100644 index 0000000000..31f1646396 --- /dev/null +++ b/src/sys_times/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "sys_times" +version = "0.1.0" +authors = ["jD91mZM2 "] + +[build-dependencies] +cbindgen = { path = "../../cbindgen" } + +[dependencies] +platform = { path = "../platform" } diff --git a/src/sys_times/build.rs b/src/sys_times/build.rs new file mode 100644 index 0000000000..d93c16000a --- /dev/null +++ b/src/sys_times/build.rs @@ -0,0 +1,11 @@ +extern crate cbindgen; + +use std::{env, fs}; + +fn main() { + let crate_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"); + fs::create_dir_all("../../target/include").expect("failed to create include directory"); + cbindgen::generate(crate_dir) + .expect("failed to generate bindings") + .write_to_file("../../target/include/sys/times.h"); +} diff --git a/src/sys_times/cbindgen.toml b/src/sys_times/cbindgen.toml new file mode 100644 index 0000000000..e8995a6f1c --- /dev/null +++ b/src/sys_times/cbindgen.toml @@ -0,0 +1,6 @@ +include_guard = "_SYS_TIMES_H" +language = "C" +style = "Tag" + +[enum] +prefix_with_name = true diff --git a/src/sys_times/src/lib.rs b/src/sys_times/src/lib.rs new file mode 100644 index 0000000000..85cc11093d --- /dev/null +++ b/src/sys_times/src/lib.rs @@ -0,0 +1,20 @@ +//! sys/times.h implementation + +#![no_std] + +extern crate platform; + +use platform::types::*; + +#[repr(C)] +pub struct tms { + tms_utime: clock_t, + tms_stime: clock_t, + tms_cutime: clock_t, + tms_cstime: clock_t +} + +#[no_mangle] +pub extern "C" fn times(out: *mut tms) -> clock_t { + platform::times(out as *mut platform::types::tms) +} diff --git a/tests/.gitignore b/tests/.gitignore index 74d32a2742..affa0abff5 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -70,6 +70,7 @@ stdlib/alloc stdlib/bsearch stdlib/mktemp time/gettimeofday +time/times unistd/chdir unistd/gethostname unistd/getid diff --git a/tests/Makefile b/tests/Makefile index fdd53fa184..d313fb3443 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -73,6 +73,7 @@ BINS=\ stdlib/bsearch \ stdlib/mktemp \ time/gettimeofday \ + time/times \ unistd/chdir \ unistd/gethostname \ unistd/getid \ diff --git a/tests/time/times.c b/tests/time/times.c new file mode 100644 index 0000000000..975aae2dd0 --- /dev/null +++ b/tests/time/times.c @@ -0,0 +1,13 @@ +#include +#include +#include + +int main() { + struct tms tms; + printf("return: %ld\n", times(&tms)); + + printf("tm_utime: %ld\n", tms.tms_utime); + printf("tm_stime: %ld\n", tms.tms_stime); + printf("tm_cutime: %ld\n", tms.tms_cutime); + printf("tm_cstime: %ld\n", tms.tms_cstime); +}