diff --git a/platform/src/linux/mod.rs b/platform/src/linux/mod.rs index adc1994cfe510ada42101aa4aa510ca3dced1f68..d8608f9e93f4d36c814cf7bbc6f4f89f3d3b8ed0 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 239d06a6be9fbdf1774b1cb46037edbbf87ef760..7964839ec2035f9ccda42d8caf07fc4248e3d9e2 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 cf911b4f6cd020306c7a225fa28fa17a08c0e18c..3db682fefa16d0214406f15b4d3f74aa1e1f67b8 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]