12 int null = open("/dev/null", 0);
16 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;
49 Xerror("can't get pipe");
52 switch(forkid = fork()){
58 start(p->code, pc+2, runq->local);
61 pushredir(ROPEN, pfd[PWR], lfd);
65 start(p->code, p->code[pc].i, runq->local);
67 pushredir(ROPEN, pfd[PRD], rfd);
68 p->pc = p->code[pc+1].i;
75 * Who should wait for the exit from the fork?
77 enum { Stralloc = 100, };
84 char *s, *wd, *ewd, *stop;
86 var *ifs = vlook("ifs");
89 stop = ifs->val? ifs->val->word: "";
91 Xerror("can't make pipe");
103 start(runq->code, runq->pc+1, runq->local);
104 pushredir(ROPEN, pfd[PWR], 1);
109 f = openfd(pfd[PRD]);
112 while((c = rchr(f))!=EOF){
115 wd = erealloc(wd, l+Stralloc);
116 ewd = wd+l+Stralloc-1;
136 /* v points to reversed arglist -- reverse it onto argv */
139 v->next = runq->argv->words;
140 runq->argv->words = v;
143 runq->pc = runq->code[runq->pc].i;
151 struct thread *p = runq;
157 Xerror("can't get pipe");
160 if(p->code[pc].i==READ){
168 switch(pid = fork()){
174 start(p->code, pc+2, runq->local);
176 pushredir(ROPEN, sidefd, p->code[pc].i==READ?1:0);
182 pushredir(ROPEN, mainfd, mainfd); /* isn't this a noop? */
183 strcpy(name, Fdprefix);
184 inttoascii(name+strlen(name), mainfd);
186 p->pc = p->code[pc+1].i;
195 switch(pid = fork()){
201 start(runq->code, runq->pc+1, runq->local);
207 runq->pc = runq->code[runq->pc].i;
219 switch(pid = fork()){
226 strcpy(buf, "can't exec: ");
228 errstr(buf+n, ERRMAX-n);