From 12833a5a5ca0fe4904fce81234f1b19236ee893d Mon Sep 17 00:00:00 2001
From: Paul Sajna <paulsajna@gmail.com>
Date: Thu, 8 Mar 2018 12:24:10 -0800
Subject: [PATCH] add test and fork

---
 src/platform/src/linux/mod.rs |  4 ++++
 src/platform/src/redox/mod.rs |  4 ++++
 src/unistd/src/lib.rs         |  2 +-
 tests/.gitignore              |  3 +++
 tests/Makefile                |  3 +++
 tests/pipe.c                  | 23 +++++++++++++++++++++++
 6 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 tests/pipe.c

diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs
index 3f32ed29..66fafabb 100644
--- a/src/platform/src/linux/mod.rs
+++ b/src/platform/src/linux/mod.rs
@@ -62,6 +62,10 @@ pub fn fchdir(fildes: c_int) -> c_int {
     e(unsafe { syscall!(FCHDIR, fildes) }) as c_int
 }
 
+pub fn fork() -> pid_t {
+    e(unsafe {syscall!(FORK) }) as pid_t
+}
+
 pub fn fsync(fildes: c_int) -> c_int {
     e(unsafe { syscall!(FSYNC, fildes) }) as c_int
 }
diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs
index 95f149bd..e9fe6dda 100644
--- a/src/platform/src/redox/mod.rs
+++ b/src/platform/src/redox/mod.rs
@@ -66,6 +66,10 @@ pub fn fchdir(fd: c_int) -> c_int {
     }
 }
 
+pub fn fork() -> pid_t {
+   e(unsafe { syscall::clone(0) }) as pid_t
+}
+
 pub fn fsync(fd: c_int) -> c_int {
     e(syscall::fsync(fd as usize)) as c_int
 }
diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs
index c9dc8804..ea4609ba 100644
--- a/src/unistd/src/lib.rs
+++ b/src/unistd/src/lib.rs
@@ -140,7 +140,7 @@ pub extern "C" fn fdatasync(fildes: c_int) -> c_int {
 
 #[no_mangle]
 pub extern "C" fn fork() -> pid_t {
-    unimplemented!();
+    platform::fork()
 }
 
 #[no_mangle]
diff --git a/tests/.gitignore b/tests/.gitignore
index dead47ff..e5819ec5 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -1,9 +1,11 @@
 /alloc
 /args
+/atoi
 /brk
 /chdir
 /create
 /create.out
+/ctype
 /dup
 /dup.out
 /error
@@ -15,5 +17,6 @@
 /link
 /link.out
 /math
+/pipe
 /printf
 /write
diff --git a/tests/Makefile b/tests/Makefile
index 7d293f72..b371961d 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -1,9 +1,11 @@
 BINS=\
 	alloc \
+	atoi \
 	brk \
 	args \
 	chdir \
 	create \
+	ctype \
 	dup \
 	error \
 	fchdir \
@@ -12,6 +14,7 @@ BINS=\
 	getid \
 	link \
 	math \
+	pipe \
 	printf \
 	write
 
diff --git a/tests/pipe.c b/tests/pipe.c
new file mode 100644
index 00000000..0ad78bc3
--- /dev/null
+++ b/tests/pipe.c
@@ -0,0 +1,23 @@
+//http://www2.cs.uregina.ca/~hamilton/courses/330/notes/unix/pipes/pipes.html
+#include <unistd.h>
+
+int main()
+{
+
+    int pid, pip[2];
+    char instring[20];
+
+    pipe(pip); 
+
+    pid = fork();
+    if (pid == 0)           /* child : sends message to parent*/
+    {
+        /* send 7 characters in the string, including end-of-string */
+        write(pip[1], "Hi Mom!", 7);  
+    }
+    else			/* parent : receives message from child */
+    {
+        /* read from the pipe */
+        read(pip[0], instring, 7);
+    }
+}
-- 
GitLab