1 4ee543e5 2005-03-18 devnull #include <u.h>
2 4ee543e5 2005-03-18 devnull #include <signal.h>
3 f08fdedc 2003-11-23 devnull #include "rc.h"
4 f08fdedc 2003-11-23 devnull #include "getflags.h"
5 f08fdedc 2003-11-23 devnull #include "exec.h"
6 f08fdedc 2003-11-23 devnull #include "io.h"
7 f08fdedc 2003-11-23 devnull #include "fns.h"
9 f08fdedc 2003-11-23 devnull int havefork = 1;
12 f08fdedc 2003-11-23 devnull Xasync(void)
14 f08fdedc 2003-11-23 devnull int null = open("/dev/null", 0);
16 4ee543e5 2005-03-18 devnull int tcpgrp, pgrp;
17 f08fdedc 2003-11-23 devnull char npid[10];
19 f08fdedc 2003-11-23 devnull if(null<0){
20 f08fdedc 2003-11-23 devnull Xerror("Can't open /dev/null\n");
23 f08fdedc 2003-11-23 devnull switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){
25 f08fdedc 2003-11-23 devnull close(null);
26 f08fdedc 2003-11-23 devnull Xerror("try again");
30 4ee543e5 2005-03-18 devnull * Should make reads of tty fail, writes succeed.
32 4ee543e5 2005-03-18 devnull signal(SIGTTIN, SIG_IGN);
33 4ee543e5 2005-03-18 devnull signal(SIGTTOU, SIG_IGN);
35 f08fdedc 2003-11-23 devnull pushredir(ROPEN, null, 0);
36 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
37 f08fdedc 2003-11-23 devnull runq->ret = 0;
40 f08fdedc 2003-11-23 devnull close(null);
41 f08fdedc 2003-11-23 devnull runq->pc = runq->code[runq->pc].i;
42 f08fdedc 2003-11-23 devnull inttoascii(npid, pid);
43 f08fdedc 2003-11-23 devnull setvar("apid", newword(npid, (word *)0));
49 f08fdedc 2003-11-23 devnull Xpipe(void)
51 f08fdedc 2003-11-23 devnull struct thread *p = runq;
52 f08fdedc 2003-11-23 devnull int pc = p->pc, forkid;
53 f08fdedc 2003-11-23 devnull int lfd = p->code[pc++].i;
54 f08fdedc 2003-11-23 devnull int rfd = p->code[pc++].i;
55 f08fdedc 2003-11-23 devnull int pfd[2];
56 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
57 f08fdedc 2003-11-23 devnull Xerror("can't get pipe");
60 f08fdedc 2003-11-23 devnull switch(forkid = fork()){
62 f08fdedc 2003-11-23 devnull Xerror("try again");
65 f08fdedc 2003-11-23 devnull start(p->code, pc+2, runq->local);
66 f08fdedc 2003-11-23 devnull runq->ret = 0;
67 f08fdedc 2003-11-23 devnull close(pfd[PRD]);
68 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[PWR], lfd);
71 f08fdedc 2003-11-23 devnull start(p->code, p->code[pc].i, runq->local);
72 f08fdedc 2003-11-23 devnull close(pfd[PWR]);
73 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[PRD], rfd);
74 f08fdedc 2003-11-23 devnull p->pc = p->code[pc+1].i;
75 f08fdedc 2003-11-23 devnull p->pid = forkid;
81 f08fdedc 2003-11-23 devnull * Who should wait for the exit from the fork?
84 f08fdedc 2003-11-23 devnull Xbackq(void)
86 f08fdedc 2003-11-23 devnull char wd[8193];
88 f08fdedc 2003-11-23 devnull char *s, *ewd=&wd[8192], *stop;
89 f08fdedc 2003-11-23 devnull struct io *f;
90 f08fdedc 2003-11-23 devnull var *ifs = vlook("ifs");
91 f08fdedc 2003-11-23 devnull word *v, *nextv;
92 f08fdedc 2003-11-23 devnull int pfd[2];
94 f08fdedc 2003-11-23 devnull stop = ifs->val?ifs->val->word:"";
95 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
96 f08fdedc 2003-11-23 devnull Xerror("can't make pipe");
99 f08fdedc 2003-11-23 devnull switch(pid = fork()){
100 f08fdedc 2003-11-23 devnull case -1:
101 f08fdedc 2003-11-23 devnull Xerror("try again");
102 f08fdedc 2003-11-23 devnull close(pfd[PRD]);
103 f08fdedc 2003-11-23 devnull close(pfd[PWR]);
106 f08fdedc 2003-11-23 devnull close(pfd[PRD]);
107 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
108 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[PWR], 1);
110 f08fdedc 2003-11-23 devnull default:
111 f08fdedc 2003-11-23 devnull close(pfd[PWR]);
112 f08fdedc 2003-11-23 devnull f = openfd(pfd[PRD]);
115 f08fdedc 2003-11-23 devnull while((c = rchr(f))!=EOF){
116 f08fdedc 2003-11-23 devnull if(strchr(stop, c) || s==ewd){
117 f08fdedc 2003-11-23 devnull if(s!=wd){
118 f08fdedc 2003-11-23 devnull *s='\0';
119 f08fdedc 2003-11-23 devnull v = newword(wd, v);
123 f08fdedc 2003-11-23 devnull else *s++=c;
125 f08fdedc 2003-11-23 devnull if(s!=wd){
126 f08fdedc 2003-11-23 devnull *s='\0';
127 f08fdedc 2003-11-23 devnull v = newword(wd, v);
129 f08fdedc 2003-11-23 devnull closeio(f);
130 f08fdedc 2003-11-23 devnull Waitfor(pid, 0);
131 f08fdedc 2003-11-23 devnull /* v points to reversed arglist -- reverse it onto argv */
132 f08fdedc 2003-11-23 devnull while(v){
133 f08fdedc 2003-11-23 devnull nextv = v->next;
134 f08fdedc 2003-11-23 devnull v->next = runq->argv->words;
135 f08fdedc 2003-11-23 devnull runq->argv->words = v;
136 f08fdedc 2003-11-23 devnull v = nextv;
138 f08fdedc 2003-11-23 devnull runq->pc = runq->code[runq->pc].i;
144 f08fdedc 2003-11-23 devnull Xpipefd(void)
146 f08fdedc 2003-11-23 devnull struct thread *p = runq;
147 f08fdedc 2003-11-23 devnull int pc = p->pc;
148 f08fdedc 2003-11-23 devnull char name[40];
149 f08fdedc 2003-11-23 devnull int pfd[2];
150 f08fdedc 2003-11-23 devnull int sidefd, mainfd;
151 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
152 f08fdedc 2003-11-23 devnull Xerror("can't get pipe");
155 f08fdedc 2003-11-23 devnull if(p->code[pc].i==READ){
156 f08fdedc 2003-11-23 devnull sidefd = pfd[PWR];
157 f08fdedc 2003-11-23 devnull mainfd = pfd[PRD];
160 f08fdedc 2003-11-23 devnull sidefd = pfd[PRD];
161 f08fdedc 2003-11-23 devnull mainfd = pfd[PWR];
163 f08fdedc 2003-11-23 devnull switch(fork()){
164 f08fdedc 2003-11-23 devnull case -1:
165 f08fdedc 2003-11-23 devnull Xerror("try again");
168 f08fdedc 2003-11-23 devnull start(p->code, pc+2, runq->local);
169 f08fdedc 2003-11-23 devnull close(mainfd);
170 f08fdedc 2003-11-23 devnull pushredir(ROPEN, sidefd, p->code[pc].i==READ?1:0);
171 f08fdedc 2003-11-23 devnull runq->ret = 0;
173 f08fdedc 2003-11-23 devnull default:
174 f08fdedc 2003-11-23 devnull close(sidefd);
175 f08fdedc 2003-11-23 devnull pushredir(ROPEN, mainfd, mainfd); /* isn't this a noop? */
176 f08fdedc 2003-11-23 devnull strcpy(name, Fdprefix);
177 f08fdedc 2003-11-23 devnull inttoascii(name+strlen(name), mainfd);
178 f08fdedc 2003-11-23 devnull pushword(name);
179 f08fdedc 2003-11-23 devnull p->pc = p->code[pc+1].i;
185 f08fdedc 2003-11-23 devnull Xsubshell(void)
187 f08fdedc 2003-11-23 devnull int pid;
188 f08fdedc 2003-11-23 devnull switch(pid = fork()){
189 f08fdedc 2003-11-23 devnull case -1:
190 f08fdedc 2003-11-23 devnull Xerror("try again");
193 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
194 f08fdedc 2003-11-23 devnull runq->ret = 0;
196 f08fdedc 2003-11-23 devnull default:
197 f08fdedc 2003-11-23 devnull Waitfor(pid, 1);
198 f08fdedc 2003-11-23 devnull runq->pc = runq->code[runq->pc].i;
204 f08fdedc 2003-11-23 devnull execforkexec(void)
206 f08fdedc 2003-11-23 devnull int pid;
208 f08fdedc 2003-11-23 devnull char buf[ERRMAX];
210 f08fdedc 2003-11-23 devnull switch(pid = fork()){
211 f08fdedc 2003-11-23 devnull case -1:
212 f08fdedc 2003-11-23 devnull return -1;
214 f08fdedc 2003-11-23 devnull pushword("exec");
215 f08fdedc 2003-11-23 devnull execexec();
216 f08fdedc 2003-11-23 devnull strcpy(buf, "can't exec: ");
217 f08fdedc 2003-11-23 devnull n = strlen(buf);
218 f08fdedc 2003-11-23 devnull errstr(buf+n, ERRMAX-n);
219 f08fdedc 2003-11-23 devnull Exit(buf);
221 f08fdedc 2003-11-23 devnull return pid;