10 int null = open("/dev/null", 0);
15 Xerror("Can't open /dev/null\n");
19 switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){
26 pushredir(ROPEN, null, 0);
27 start(runq->code, runq->pc+1, runq->local);
33 runq->pc = runq->code[runq->pc].i;
34 inttoascii(npid, pid);
35 setvar("apid", newword(npid, (word *)0));
43 struct thread *p = runq;
44 int pc = p->pc, forkid;
45 int lfd = p->code[pc++].i;
46 int rfd = p->code[pc++].i;
50 Xerror("can't get pipe");
54 switch(forkid = fork()){
60 start(p->code, pc+2, runq->local);
63 pushredir(ROPEN, pfd[PWR], lfd);
67 start(p->code, p->code[pc].i, runq->local);
69 pushredir(ROPEN, pfd[PRD], rfd);
70 p->pc = p->code[pc+1].i;
77 * Who should wait for the exit from the fork?
79 enum { Stralloc = 100, };
86 char *s, *wd, *ewd, *stop;
91 if(runq->argv && runq->argv->words)
92 stop = runq->argv->words->word;
94 Xerror("can't make pipe");
107 start(runq->code, runq->pc+1, runq->local);
108 pushredir(ROPEN, pfd[PWR], 1);
113 f = openfd(pfd[PRD]);
116 while((c = rchr(f))!=EOF){
119 wd = erealloc(wd, l+Stralloc);
120 ewd = wd+l+Stralloc-1;
139 poplist(); /* ditch split in "stop" */
140 /* v points to reversed arglist -- reverse it onto argv */
143 v->next = runq->argv->words;
144 runq->argv->words = v;
147 runq->pc = runq->code[runq->pc].i;
155 struct thread *p = runq;
162 Xerror("can't get pipe");
165 if(p->code[pc].i==READ){
174 switch(pid = fork()){
180 start(p->code, pc+2, runq->local);
182 pushredir(ROPEN, sidefd, p->code[pc].i==READ?1:0);
188 pushredir(ROPEN, mainfd, mainfd);
189 shuffleredir(); /* shuffle redir to bottom of stack for turfredir() */
190 strcpy(name, Fdprefix);
191 inttoascii(name+strlen(name), mainfd);
193 p->pc = p->code[pc+1].i;
204 switch(pid = fork()){
210 start(runq->code, runq->pc+1, runq->local);
216 runq->pc = runq->code[runq->pc].i;
228 switch(pid = fork()){
235 strcpy(buf, "can't exec: ");
237 errstr(buf+n, ERRMAX-n);