From f85e9bfbe5bfef4d8ce5985d29d9a173aa4d5fb0 Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Sun, 17 Aug 2014 03:07:38 -0700 Subject: More socket APIs --- src/unistd.rs | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) (limited to 'src/unistd.rs') 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 { + 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 { + 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) +} -- cgit v1.2.3