From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/ape/lib/bsd/popen.c | 84 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 sys/src/ape/lib/bsd/popen.c (limited to 'sys/src/ape/lib/bsd/popen.c') diff --git a/sys/src/ape/lib/bsd/popen.c b/sys/src/ape/lib/bsd/popen.c new file mode 100755 index 000000000..32af1de3d --- /dev/null +++ b/sys/src/ape/lib/bsd/popen.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include + +#define MAXFORKS 20 +#define NSYSFILE 3 +#define tst(a,b) (*mode == 'r'? (b) : (a)) +#define RDR 0 +#define WTR 1 + +struct a_fork { + short done; + short fd; + int pid; + int status; +}; +static struct a_fork the_fork[MAXFORKS]; + +FILE * +popen(char *cmd, char *mode) +{ + int p[2]; + int myside, hisside, pid; + int i, ind; + + for (ind = 0; ind < MAXFORKS; ind++) + if (the_fork[ind].pid == 0) + break; + if (ind == MAXFORKS) + return NULL; + if(pipe(p) < 0) + return NULL; + myside = tst(p[WTR], p[RDR]); + hisside = tst(p[RDR], p[WTR]); + switch (pid = fork()) { + case -1: + return NULL; + case 0: + /* myside and hisside reverse roles in child */ + close(myside); + dup2(hisside, tst(0, 1)); + for (i=NSYSFILE; i