From 33f1033e0eb1a59049f941b35fc531d892cd3244 Mon Sep 17 00:00:00 2001
From: Paul Sajna <paulsajna@gmail.com>
Date: Wed, 7 Mar 2018 23:30:10 -0800
Subject: [PATCH] implement pipe and read

---
 src/platform/Cargo.toml       |  3 +++
 src/platform/src/lib.rs       |  2 ++
 src/platform/src/linux/mod.rs |  8 ++++++++
 src/platform/src/redox/mod.rs | 15 +++++++++++++++
 src/unistd/src/lib.rs         |  6 ++++--
 5 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/platform/Cargo.toml b/src/platform/Cargo.toml
index e25b8251..a00eb79b 100644
--- a/src/platform/Cargo.toml
+++ b/src/platform/Cargo.toml
@@ -8,3 +8,6 @@ sc = "0.2"
 
 [target.'cfg(target_os = "redox")'.dependencies]
 redox_syscall = "0.1"
+
+[dependencies]
+alloc-no-stdlib = "1.2"
diff --git a/src/platform/src/lib.rs b/src/platform/src/lib.rs
index a3270531..0506cdee 100644
--- a/src/platform/src/lib.rs
+++ b/src/platform/src/lib.rs
@@ -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]
diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs
index a8d72093..3f32ed29 100644
--- a/src/platform/src/linux/mod.rs
+++ b/src/platform/src/linux/mod.rs
@@ -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
 }
diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs
index 057ad80b..95f149bd 100644
--- a/src/platform/src/redox/mod.rs
+++ b/src/platform/src/redox/mod.rs
@@ -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
 }
diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs
index 90811a6c..c9dc8804 100644
--- a/src/unistd/src/lib.rs
+++ b/src/unistd/src/lib.rs
@@ -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]
-- 
GitLab