aboutsummaryrefslogtreecommitdiff
path: root/src/lib9/ffork-Linux.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib9/ffork-Linux.c')
-rw-r--r--src/lib9/ffork-Linux.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/lib9/ffork-Linux.c b/src/lib9/ffork-Linux.c
new file mode 100644
index 00000000..aad80041
--- /dev/null
+++ b/src/lib9/ffork-Linux.c
@@ -0,0 +1,39 @@
+#include <sched.h>
+#include <signal.h>
+#include <lib9.h>
+
+int fforkstacksize = 16384;
+
+int
+ffork(int flags, void (*fn)(void*), void *arg)
+{
+ char *p;
+ int cloneflag, pid;
+
+ p = malloc(fforkstacksize);
+ if(p == nil)
+ return -1;
+ cloneflag = 0;
+ flags &= ~RFPROC;
+ if(flags&RFMEM){
+ cloneflag |= CLONE_VM;
+ flags &= ~RFMEM;
+ }
+ if(!(flags&RFFDG))
+ cloneflag |= CLONE_FILES;
+ else
+ flags &= ~RFFDG;
+ if(!(flags&RFNOWAIT))
+ cloneflag |= SIGCHLD;
+ else
+ flags &= ~RFNOWAIT;
+ if(flags){
+ fprint(2, "unknown rfork flags %x\n", flags);
+ return -1;
+ }
+ pid = clone((int(*)(void*))fn, p+fforkstacksize-16, cloneflag, arg);
+ if(pid < 0)
+ free(p);
+ return pid;
+}
+