Blame


1 f08fdedc 2003-11-23 devnull #include "rc.h"
2 f08fdedc 2003-11-23 devnull #include "getflags.h"
3 f08fdedc 2003-11-23 devnull #include "exec.h"
4 f08fdedc 2003-11-23 devnull #include "io.h"
5 f08fdedc 2003-11-23 devnull #include "fns.h"
6 f08fdedc 2003-11-23 devnull
7 f08fdedc 2003-11-23 devnull int havefork = 1;
8 f08fdedc 2003-11-23 devnull
9 f08fdedc 2003-11-23 devnull void
10 f08fdedc 2003-11-23 devnull Xasync(void)
11 f08fdedc 2003-11-23 devnull {
12 f08fdedc 2003-11-23 devnull int null = open("/dev/null", 0);
13 f08fdedc 2003-11-23 devnull int pid;
14 f08fdedc 2003-11-23 devnull char npid[10];
15 f08fdedc 2003-11-23 devnull if(null<0){
16 f08fdedc 2003-11-23 devnull Xerror("Can't open /dev/null\n");
17 f08fdedc 2003-11-23 devnull return;
18 f08fdedc 2003-11-23 devnull }
19 f08fdedc 2003-11-23 devnull switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){
20 f08fdedc 2003-11-23 devnull case -1:
21 f08fdedc 2003-11-23 devnull close(null);
22 f08fdedc 2003-11-23 devnull Xerror("try again");
23 f08fdedc 2003-11-23 devnull break;
24 f08fdedc 2003-11-23 devnull case 0:
25 f08fdedc 2003-11-23 devnull pushredir(ROPEN, null, 0);
26 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
27 f08fdedc 2003-11-23 devnull runq->ret = 0;
28 f08fdedc 2003-11-23 devnull break;
29 f08fdedc 2003-11-23 devnull default:
30 f08fdedc 2003-11-23 devnull close(null);
31 f08fdedc 2003-11-23 devnull runq->pc = runq->code[runq->pc].i;
32 f08fdedc 2003-11-23 devnull inttoascii(npid, pid);
33 f08fdedc 2003-11-23 devnull setvar("apid", newword(npid, (word *)0));
34 f08fdedc 2003-11-23 devnull break;
35 f08fdedc 2003-11-23 devnull }
36 f08fdedc 2003-11-23 devnull }
37 f08fdedc 2003-11-23 devnull
38 f08fdedc 2003-11-23 devnull void
39 f08fdedc 2003-11-23 devnull Xpipe(void)
40 f08fdedc 2003-11-23 devnull {
41 f08fdedc 2003-11-23 devnull struct thread *p = runq;
42 f08fdedc 2003-11-23 devnull int pc = p->pc, forkid;
43 f08fdedc 2003-11-23 devnull int lfd = p->code[pc++].i;
44 f08fdedc 2003-11-23 devnull int rfd = p->code[pc++].i;
45 f08fdedc 2003-11-23 devnull int pfd[2];
46 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
47 f08fdedc 2003-11-23 devnull Xerror("can't get pipe");
48 f08fdedc 2003-11-23 devnull return;
49 f08fdedc 2003-11-23 devnull }
50 f08fdedc 2003-11-23 devnull switch(forkid = fork()){
51 f08fdedc 2003-11-23 devnull case -1:
52 f08fdedc 2003-11-23 devnull Xerror("try again");
53 f08fdedc 2003-11-23 devnull break;
54 f08fdedc 2003-11-23 devnull case 0:
55 f08fdedc 2003-11-23 devnull start(p->code, pc+2, runq->local);
56 f08fdedc 2003-11-23 devnull runq->ret = 0;
57 f08fdedc 2003-11-23 devnull close(pfd[PRD]);
58 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[PWR], lfd);
59 f08fdedc 2003-11-23 devnull break;
60 f08fdedc 2003-11-23 devnull default:
61 f08fdedc 2003-11-23 devnull start(p->code, p->code[pc].i, runq->local);
62 f08fdedc 2003-11-23 devnull close(pfd[PWR]);
63 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[PRD], rfd);
64 f08fdedc 2003-11-23 devnull p->pc = p->code[pc+1].i;
65 f08fdedc 2003-11-23 devnull p->pid = forkid;
66 f08fdedc 2003-11-23 devnull break;
67 f08fdedc 2003-11-23 devnull }
68 f08fdedc 2003-11-23 devnull }
69 f08fdedc 2003-11-23 devnull
70 f08fdedc 2003-11-23 devnull /*
71 f08fdedc 2003-11-23 devnull * Who should wait for the exit from the fork?
72 f08fdedc 2003-11-23 devnull */
73 f08fdedc 2003-11-23 devnull void
74 f08fdedc 2003-11-23 devnull Xbackq(void)
75 f08fdedc 2003-11-23 devnull {
76 f08fdedc 2003-11-23 devnull char wd[8193];
77 f08fdedc 2003-11-23 devnull int c;
78 f08fdedc 2003-11-23 devnull char *s, *ewd=&wd[8192], *stop;
79 f08fdedc 2003-11-23 devnull struct io *f;
80 f08fdedc 2003-11-23 devnull var *ifs = vlook("ifs");
81 f08fdedc 2003-11-23 devnull word *v, *nextv;
82 f08fdedc 2003-11-23 devnull int pfd[2];
83 f08fdedc 2003-11-23 devnull int pid;
84 f08fdedc 2003-11-23 devnull stop = ifs->val?ifs->val->word:"";
85 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
86 f08fdedc 2003-11-23 devnull Xerror("can't make pipe");
87 f08fdedc 2003-11-23 devnull return;
88 f08fdedc 2003-11-23 devnull }
89 f08fdedc 2003-11-23 devnull switch(pid = fork()){
90 f08fdedc 2003-11-23 devnull case -1:
91 f08fdedc 2003-11-23 devnull Xerror("try again");
92 f08fdedc 2003-11-23 devnull close(pfd[PRD]);
93 f08fdedc 2003-11-23 devnull close(pfd[PWR]);
94 f08fdedc 2003-11-23 devnull return;
95 f08fdedc 2003-11-23 devnull case 0:
96 f08fdedc 2003-11-23 devnull close(pfd[PRD]);
97 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
98 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[PWR], 1);
99 f08fdedc 2003-11-23 devnull return;
100 f08fdedc 2003-11-23 devnull default:
101 f08fdedc 2003-11-23 devnull close(pfd[PWR]);
102 f08fdedc 2003-11-23 devnull f = openfd(pfd[PRD]);
103 f08fdedc 2003-11-23 devnull s = wd;
104 f08fdedc 2003-11-23 devnull v = 0;
105 f08fdedc 2003-11-23 devnull while((c = rchr(f))!=EOF){
106 f08fdedc 2003-11-23 devnull if(strchr(stop, c) || s==ewd){
107 f08fdedc 2003-11-23 devnull if(s!=wd){
108 f08fdedc 2003-11-23 devnull *s='\0';
109 f08fdedc 2003-11-23 devnull v = newword(wd, v);
110 f08fdedc 2003-11-23 devnull s = wd;
111 f08fdedc 2003-11-23 devnull }
112 f08fdedc 2003-11-23 devnull }
113 f08fdedc 2003-11-23 devnull else *s++=c;
114 f08fdedc 2003-11-23 devnull }
115 f08fdedc 2003-11-23 devnull if(s!=wd){
116 f08fdedc 2003-11-23 devnull *s='\0';
117 f08fdedc 2003-11-23 devnull v = newword(wd, v);
118 f08fdedc 2003-11-23 devnull }
119 f08fdedc 2003-11-23 devnull closeio(f);
120 f08fdedc 2003-11-23 devnull Waitfor(pid, 0);
121 f08fdedc 2003-11-23 devnull /* v points to reversed arglist -- reverse it onto argv */
122 f08fdedc 2003-11-23 devnull while(v){
123 f08fdedc 2003-11-23 devnull nextv = v->next;
124 f08fdedc 2003-11-23 devnull v->next = runq->argv->words;
125 f08fdedc 2003-11-23 devnull runq->argv->words = v;
126 f08fdedc 2003-11-23 devnull v = nextv;
127 f08fdedc 2003-11-23 devnull }
128 f08fdedc 2003-11-23 devnull runq->pc = runq->code[runq->pc].i;
129 f08fdedc 2003-11-23 devnull return;
130 f08fdedc 2003-11-23 devnull }
131 f08fdedc 2003-11-23 devnull }
132 f08fdedc 2003-11-23 devnull
133 f08fdedc 2003-11-23 devnull void
134 f08fdedc 2003-11-23 devnull Xpipefd(void)
135 f08fdedc 2003-11-23 devnull {
136 f08fdedc 2003-11-23 devnull struct thread *p = runq;
137 f08fdedc 2003-11-23 devnull int pc = p->pc;
138 f08fdedc 2003-11-23 devnull char name[40];
139 f08fdedc 2003-11-23 devnull int pfd[2];
140 f08fdedc 2003-11-23 devnull int sidefd, mainfd;
141 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
142 f08fdedc 2003-11-23 devnull Xerror("can't get pipe");
143 f08fdedc 2003-11-23 devnull return;
144 f08fdedc 2003-11-23 devnull }
145 f08fdedc 2003-11-23 devnull if(p->code[pc].i==READ){
146 f08fdedc 2003-11-23 devnull sidefd = pfd[PWR];
147 f08fdedc 2003-11-23 devnull mainfd = pfd[PRD];
148 f08fdedc 2003-11-23 devnull }
149 f08fdedc 2003-11-23 devnull else{
150 f08fdedc 2003-11-23 devnull sidefd = pfd[PRD];
151 f08fdedc 2003-11-23 devnull mainfd = pfd[PWR];
152 f08fdedc 2003-11-23 devnull }
153 f08fdedc 2003-11-23 devnull switch(fork()){
154 f08fdedc 2003-11-23 devnull case -1:
155 f08fdedc 2003-11-23 devnull Xerror("try again");
156 f08fdedc 2003-11-23 devnull break;
157 f08fdedc 2003-11-23 devnull case 0:
158 f08fdedc 2003-11-23 devnull start(p->code, pc+2, runq->local);
159 f08fdedc 2003-11-23 devnull close(mainfd);
160 f08fdedc 2003-11-23 devnull pushredir(ROPEN, sidefd, p->code[pc].i==READ?1:0);
161 f08fdedc 2003-11-23 devnull runq->ret = 0;
162 f08fdedc 2003-11-23 devnull break;
163 f08fdedc 2003-11-23 devnull default:
164 f08fdedc 2003-11-23 devnull close(sidefd);
165 f08fdedc 2003-11-23 devnull pushredir(ROPEN, mainfd, mainfd); /* isn't this a noop? */
166 f08fdedc 2003-11-23 devnull strcpy(name, Fdprefix);
167 f08fdedc 2003-11-23 devnull inttoascii(name+strlen(name), mainfd);
168 f08fdedc 2003-11-23 devnull pushword(name);
169 f08fdedc 2003-11-23 devnull p->pc = p->code[pc+1].i;
170 f08fdedc 2003-11-23 devnull break;
171 f08fdedc 2003-11-23 devnull }
172 f08fdedc 2003-11-23 devnull }
173 f08fdedc 2003-11-23 devnull
174 f08fdedc 2003-11-23 devnull void
175 f08fdedc 2003-11-23 devnull Xsubshell(void)
176 f08fdedc 2003-11-23 devnull {
177 f08fdedc 2003-11-23 devnull int pid;
178 f08fdedc 2003-11-23 devnull switch(pid = fork()){
179 f08fdedc 2003-11-23 devnull case -1:
180 f08fdedc 2003-11-23 devnull Xerror("try again");
181 f08fdedc 2003-11-23 devnull break;
182 f08fdedc 2003-11-23 devnull case 0:
183 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
184 f08fdedc 2003-11-23 devnull runq->ret = 0;
185 f08fdedc 2003-11-23 devnull break;
186 f08fdedc 2003-11-23 devnull default:
187 f08fdedc 2003-11-23 devnull Waitfor(pid, 1);
188 f08fdedc 2003-11-23 devnull runq->pc = runq->code[runq->pc].i;
189 f08fdedc 2003-11-23 devnull break;
190 f08fdedc 2003-11-23 devnull }
191 f08fdedc 2003-11-23 devnull }
192 f08fdedc 2003-11-23 devnull
193 f08fdedc 2003-11-23 devnull int
194 f08fdedc 2003-11-23 devnull execforkexec(void)
195 f08fdedc 2003-11-23 devnull {
196 f08fdedc 2003-11-23 devnull int pid;
197 f08fdedc 2003-11-23 devnull int n;
198 f08fdedc 2003-11-23 devnull char buf[ERRMAX];
199 f08fdedc 2003-11-23 devnull
200 f08fdedc 2003-11-23 devnull switch(pid = fork()){
201 f08fdedc 2003-11-23 devnull case -1:
202 f08fdedc 2003-11-23 devnull return -1;
203 f08fdedc 2003-11-23 devnull case 0:
204 f08fdedc 2003-11-23 devnull pushword("exec");
205 f08fdedc 2003-11-23 devnull execexec();
206 f08fdedc 2003-11-23 devnull strcpy(buf, "can't exec: ");
207 f08fdedc 2003-11-23 devnull n = strlen(buf);
208 f08fdedc 2003-11-23 devnull errstr(buf+n, ERRMAX-n);
209 f08fdedc 2003-11-23 devnull Exit(buf);
210 f08fdedc 2003-11-23 devnull }
211 f08fdedc 2003-11-23 devnull return pid;
212 f08fdedc 2003-11-23 devnull }