瀏覽代碼

implement some unistd

Paul Sajna 7 年之前
父節點
當前提交
d9d7440a7f
共有 3 個文件被更改,包括 42 次插入3 次删除
  1. 18 0
      platform/src/linux/mod.rs
  2. 21 0
      platform/src/redox/mod.rs
  3. 3 3
      src/unistd/src/lib.rs

+ 18 - 0
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);

+ 21 - 0
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);
 }

+ 3 - 3
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]