implement pipe and read

This commit is contained in:
Paul Sajna
2018-03-07 23:30:10 -08:00
parent 1127c36ceb
commit 33f1033e0e
5 changed files with 32 additions and 2 deletions
+3
View File
@@ -8,3 +8,6 @@ sc = "0.2"
[target.'cfg(target_os = "redox")'.dependencies]
redox_syscall = "0.1"
[dependencies]
alloc-no-stdlib = "1.2"
+2
View File
@@ -3,6 +3,8 @@
#![no_std]
#![allow(non_camel_case_types)]
//TODO #![feature(thread_local)]
#![feature(alloc)]
extern crate alloc;
#[cfg(all(not(feature = "no_std"), target_os = "linux"))]
#[macro_use]
+8
View File
@@ -114,6 +114,14 @@ pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int {
e(unsafe { syscall!(OPENAT, AT_FDCWD, path, oflag, mode) }) as c_int
}
pub fn pipe(fildes: [c_int; 2]) -> c_int {
e(unsafe { syscall!(PIPE2, fildes.as_ptr(), 0) }) as c_int
}
pub fn read(fildes: c_int, buf: &[u8]) -> ssize_t {
e(unsafe { syscall!(READ, fildes, buf.as_ptr(), buf.len()) }) as ssize_t
}
pub fn write(fildes: c_int, buf: &[u8]) -> ssize_t {
e(unsafe { syscall!(WRITE, fildes, buf.as_ptr(), buf.len()) }) as ssize_t
}
+15
View File
@@ -1,5 +1,8 @@
extern crate alloc;
use core::ptr;
use core::slice;
use alloc::Vec;
use syscall;
use c_str;
@@ -119,6 +122,18 @@ pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int {
e(syscall::open(path, (oflag as usize) | (mode as usize))) as c_int
}
pub fn pipe(fds: [c_int; 2]) -> c_int {
let usize_vec = fds.iter().map(|x| *x as usize).collect::<Vec<usize>>();
let usize_slice = usize_vec.as_slice();
let mut usize_arr: [usize; 2] = Default::default();
usize_arr.copy_from_slice(usize_slice);
e(syscall::pipe2(&mut usize_arr, 0)) as c_int
}
pub fn read(fd: c_int, buf: &mut [u8]) -> ssize_t {
e(syscall::read(fd as usize, buf)) as ssize_t
}
pub fn write(fd: c_int, buf: &[u8]) -> ssize_t {
e(syscall::write(fd as usize, buf)) as ssize_t
}
+4 -2
View File
@@ -295,7 +295,7 @@ pub extern "C" fn pause() -> c_int {
#[no_mangle]
pub extern "C" fn pipe(fildes: [c_int; 2]) -> c_int {
unimplemented!();
platform::pipe(fildes)
}
#[no_mangle]
@@ -324,7 +324,9 @@ pub extern "C" fn pwrite(
#[no_mangle]
pub extern "C" fn read(fildes: c_int, buf: *const c_void, nbyte: size_t) -> ssize_t {
unimplemented!();
use core::slice;
let buf = unsafe { slice::from_raw_parts_mut(buf as *mut u8, nbyte as usize) };
platform::read(fildes, buf)
}
#[no_mangle]