From d9d7440a7ffe5e4c68611ec370bc784866d08cc6 Mon Sep 17 00:00:00 2001 From: Paul Sajna <paulsajna@gmail.com> Date: Sun, 4 Mar 2018 06:37:45 -0800 Subject: [PATCH] implement some unistd --- platform/src/linux/mod.rs | 18 ++++++++++++++++++ platform/src/redox/mod.rs | 21 +++++++++++++++++++++ src/unistd/src/lib.rs | 6 +++--- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/platform/src/linux/mod.rs b/platform/src/linux/mod.rs index adc1994c..d8608f9e 100644 --- a/platform/src/linux/mod.rs +++ b/platform/src/linux/mod.rs @@ -2,12 +2,30 @@ use types::*; const AT_FDCWD: c_int = -100; +pub fn chdir(path: *const c_char) -> c_int { + unsafe { + syscall!(CHDIR, path) as c_int + } +} + pub fn close(fildes: c_int) -> c_int { unsafe { syscall!(CLOSE, fildes) as c_int } } +pub fn dup(fildes: c_int) -> c_int { + unsafe { + syscall!(DUP, fildes) as c_int + } +} + +pub fn dup2(fildes: c_int, fildes2:c_int) -> c_int { + unsafe { + syscall!(DUP2, fildes, fildes2) as c_int + } +} + pub fn exit(status: c_int) -> ! { unsafe { syscall!(EXIT, status); diff --git a/platform/src/redox/mod.rs b/platform/src/redox/mod.rs index 239d06a6..7964839e 100644 --- a/platform/src/redox/mod.rs +++ b/platform/src/redox/mod.rs @@ -1,3 +1,24 @@ +use core::slice; + +pub unsafe fn cstr_to_slice<'a>(buf: *const c_char) -> &'a [u8] { + slice::from_raw_parts(buf as *const u8, ::strlen(buf) as usize) +} + +pub fn chdir(path: *const c_char) -> c_int { + syscall::chdir(cstr_to_slice(path))? as c_int +} + +pub fn close(fildes: c_int) -> c_int { + syscall::close(fildes as usize)? as c_int +} + +pub fn dup(fildes: c_int) -> c_int { + syscall::dup(file as usize, &[])? as c_int +} + +pub fn dup2(fildes: c_int, fildes2) -> c_int { + syscall::dup2(fildes as usize, fildes2 as usize, &[])? as c_int + pub fn exit(status: c_int) -> ! { syscall::exit(status); } diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs index cf911b4f..3db682fe 100644 --- a/src/unistd/src/lib.rs +++ b/src/unistd/src/lib.rs @@ -46,7 +46,7 @@ pub extern "C" fn brk(addr: *mut c_void) -> c_int { #[no_mangle] pub extern "C" fn chdir(path: *const c_char) -> c_int { - unimplemented!(); + platform::chdir(path) } #[no_mangle] @@ -86,12 +86,12 @@ pub extern "C" fn cuserid(s: *mut c_char) -> *mut c_char { #[no_mangle] pub extern "C" fn dup(fildes: c_int) -> c_int { - unimplemented!(); + platform::dup(fildes) } #[no_mangle] pub extern "C" fn dup2(fildes: c_int, fildes2: c_int) -> c_int { - unimplemented!(); + platform::dup2(fildes, fildes2) } #[no_mangle] -- GitLab