summaryrefslogtreecommitdiff
path: root/src/unistd.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/unistd.rs')
-rw-r--r--src/unistd.rs34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/unistd.rs b/src/unistd.rs
index f4c4daa1..4b141f17 100644
--- a/src/unistd.rs
+++ b/src/unistd.rs
@@ -3,19 +3,20 @@
use std::ptr;
use std::c_str::{CString, ToCStr};
use std::path::Path;
-use libc::{c_char};
+use libc::{c_char, c_void, size_t};
use fcntl::{Fd, OFlag};
use syscall::{syscall, SysPivotRoot};
-use {SysResult, SysError};
+use errno::{SysResult, SysError, from_ffi};
mod ffi {
use libc::{c_char, c_int};
+ pub use libc::{close, read, write};
extern {
+ // duplicate a file descriptor
+ // doc: http://man7.org/linux/man-pages/man2/dup.2.html
pub fn dup(oldfd: c_int) -> c_int;
-
pub fn dup2(oldfd: c_int, newfd: c_int) -> c_int;
-
pub fn dup3(oldfd: c_int, newfd: c_int, flags: c_int) -> c_int;
// change working directory
@@ -107,3 +108,28 @@ pub fn pivot_root(new_root: &Path, put_old: &Path) -> SysResult<()> {
Ok(())
}
+
+pub fn close(fd: Fd) -> SysResult<()> {
+ let res = unsafe { ffi::close(fd) };
+ from_ffi(res)
+}
+
+pub fn read(fd: Fd, buf: &mut [u8]) -> SysResult<uint> {
+ let res = unsafe { ffi::read(fd, buf.as_mut_ptr() as *mut c_void, buf.len() as size_t) };
+
+ if res < 0 {
+ return Err(SysError::last());
+ }
+
+ return Ok(res as uint)
+}
+
+pub fn write(fd: Fd, buf: &[u8]) -> SysResult<uint> {
+ let res = unsafe { ffi::write(fd, buf.as_ptr() as *const c_void, buf.len() as size_t) };
+
+ if res < 0 {
+ return Err(SysError::last());
+ }
+
+ return Ok(res as uint)
+}