Blame


1 4b241872 2007-03-26 devnull #include <u.h>
2 4b241872 2007-03-26 devnull #include <signal.h>
3 4b241872 2007-03-26 devnull #if defined(PLAN9PORT) && defined(__sun__)
4 4b241872 2007-03-26 devnull # define BSD_COMP /* sigh. for TIOCNOTTY */
5 4b241872 2007-03-26 devnull #endif
6 4b241872 2007-03-26 devnull #include <sys/ioctl.h>
7 f08fdedc 2003-11-23 devnull #include "rc.h"
8 f08fdedc 2003-11-23 devnull #include "getflags.h"
9 f08fdedc 2003-11-23 devnull #include "exec.h"
10 f08fdedc 2003-11-23 devnull #include "io.h"
11 f08fdedc 2003-11-23 devnull #include "fns.h"
12 f08fdedc 2003-11-23 devnull
13 f08fdedc 2003-11-23 devnull int havefork = 1;
14 f08fdedc 2003-11-23 devnull
15 f08fdedc 2003-11-23 devnull void
16 f08fdedc 2003-11-23 devnull Xasync(void)
17 f08fdedc 2003-11-23 devnull {
18 f08fdedc 2003-11-23 devnull int null = open("/dev/null", 0);
19 4b241872 2007-03-26 devnull int tty;
20 f08fdedc 2003-11-23 devnull int pid;
21 f08fdedc 2003-11-23 devnull char npid[10];
22 f08fdedc 2003-11-23 devnull if(null<0){
23 f08fdedc 2003-11-23 devnull Xerror("Can't open /dev/null\n");
24 f08fdedc 2003-11-23 devnull return;
25 f08fdedc 2003-11-23 devnull }
26 f08fdedc 2003-11-23 devnull switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){
27 f08fdedc 2003-11-23 devnull case -1:
28 f08fdedc 2003-11-23 devnull close(null);
29 f08fdedc 2003-11-23 devnull Xerror("try again");
30 f08fdedc 2003-11-23 devnull break;
31 f08fdedc 2003-11-23 devnull case 0:
32 4b241872 2007-03-26 devnull clearwaitpids();
33 4b241872 2007-03-26 devnull /*
34 4b241872 2007-03-26 devnull * I don't know what the right thing to do here is,
35 4b241872 2007-03-26 devnull * so this is all experimentally determined.
36 4b241872 2007-03-26 devnull * If we just dup /dev/null onto 0, then running
37 4b241872 2007-03-26 devnull * ssh foo & will reopen /dev/tty, try to read a password,
38 4b241872 2007-03-26 devnull * get a signal, and repeat, in a tight loop, forever.
39 4b241872 2007-03-26 devnull * Arguably this is a bug in ssh (it behaves the same
40 fa325e9b 2020-01-10 cross * way under bash as under rc) but I'm fixing it here
41 4b241872 2007-03-26 devnull * anyway. If we dissociate the process from the tty,
42 4b241872 2007-03-26 devnull * then it won't be able to open /dev/tty ever again.
43 4b241872 2007-03-26 devnull * The SIG_IGN on SIGTTOU makes writing the tty
44 fa325e9b 2020-01-10 cross * (via fd 1 or 2, for example) succeed even though
45 4b241872 2007-03-26 devnull * our pgrp is not the terminal's controlling pgrp.
46 4b241872 2007-03-26 devnull */
47 4b241872 2007-03-26 devnull if((tty = open("/dev/tty", OREAD)) >= 0){
48 4b241872 2007-03-26 devnull /*
49 4b241872 2007-03-26 devnull * Should make reads of tty fail, writes succeed.
50 4b241872 2007-03-26 devnull */
51 4b241872 2007-03-26 devnull signal(SIGTTIN, SIG_IGN);
52 4b241872 2007-03-26 devnull signal(SIGTTOU, SIG_IGN);
53 4b241872 2007-03-26 devnull ioctl(tty, TIOCNOTTY);
54 4b241872 2007-03-26 devnull close(tty);
55 4b241872 2007-03-26 devnull }
56 4b241872 2007-03-26 devnull if(isatty(0))
57 4b241872 2007-03-26 devnull pushredir(ROPEN, null, 0);
58 4b241872 2007-03-26 devnull else
59 4b241872 2007-03-26 devnull close(null);
60 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
61 f08fdedc 2003-11-23 devnull runq->ret = 0;
62 f08fdedc 2003-11-23 devnull break;
63 f08fdedc 2003-11-23 devnull default:
64 4b241872 2007-03-26 devnull addwaitpid(pid);
65 f08fdedc 2003-11-23 devnull close(null);
66 f08fdedc 2003-11-23 devnull runq->pc = runq->code[runq->pc].i;
67 f08fdedc 2003-11-23 devnull inttoascii(npid, pid);
68 f08fdedc 2003-11-23 devnull setvar("apid", newword(npid, (word *)0));
69 f08fdedc 2003-11-23 devnull break;
70 f08fdedc 2003-11-23 devnull }
71 f08fdedc 2003-11-23 devnull }
72 f08fdedc 2003-11-23 devnull
73 f08fdedc 2003-11-23 devnull void
74 f08fdedc 2003-11-23 devnull Xpipe(void)
75 f08fdedc 2003-11-23 devnull {
76 f08fdedc 2003-11-23 devnull struct thread *p = runq;
77 f08fdedc 2003-11-23 devnull int pc = p->pc, forkid;
78 f08fdedc 2003-11-23 devnull int lfd = p->code[pc++].i;
79 f08fdedc 2003-11-23 devnull int rfd = p->code[pc++].i;
80 f08fdedc 2003-11-23 devnull int pfd[2];
81 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
82 f08fdedc 2003-11-23 devnull Xerror("can't get pipe");
83 f08fdedc 2003-11-23 devnull return;
84 f08fdedc 2003-11-23 devnull }
85 f08fdedc 2003-11-23 devnull switch(forkid = fork()){
86 f08fdedc 2003-11-23 devnull case -1:
87 f08fdedc 2003-11-23 devnull Xerror("try again");
88 f08fdedc 2003-11-23 devnull break;
89 f08fdedc 2003-11-23 devnull case 0:
90 4b241872 2007-03-26 devnull clearwaitpids();
91 f08fdedc 2003-11-23 devnull start(p->code, pc+2, runq->local);
92 f08fdedc 2003-11-23 devnull runq->ret = 0;
93 f08fdedc 2003-11-23 devnull close(pfd[PRD]);
94 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[PWR], lfd);
95 f08fdedc 2003-11-23 devnull break;
96 f08fdedc 2003-11-23 devnull default:
97 4b241872 2007-03-26 devnull addwaitpid(forkid);
98 f08fdedc 2003-11-23 devnull start(p->code, p->code[pc].i, runq->local);
99 f08fdedc 2003-11-23 devnull close(pfd[PWR]);
100 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[PRD], rfd);
101 f08fdedc 2003-11-23 devnull p->pc = p->code[pc+1].i;
102 f08fdedc 2003-11-23 devnull p->pid = forkid;
103 f08fdedc 2003-11-23 devnull break;
104 f08fdedc 2003-11-23 devnull }
105 f08fdedc 2003-11-23 devnull }
106 f08fdedc 2003-11-23 devnull
107 f08fdedc 2003-11-23 devnull /*
108 f08fdedc 2003-11-23 devnull * Who should wait for the exit from the fork?
109 f08fdedc 2003-11-23 devnull */
110 f08fdedc 2003-11-23 devnull void
111 f08fdedc 2003-11-23 devnull Xbackq(void)
112 f08fdedc 2003-11-23 devnull {
113 74be4603 2009-08-08 mt4swm struct thread *p = runq;
114 f08fdedc 2003-11-23 devnull char wd[8193];
115 72f66c2d 2011-01-02 rsc int c, n;
116 72f66c2d 2011-01-02 rsc char *s, *ewd=&wd[8192], *stop, *q;
117 f08fdedc 2003-11-23 devnull struct io *f;
118 f08fdedc 2003-11-23 devnull var *ifs = vlook("ifs");
119 f08fdedc 2003-11-23 devnull word *v, *nextv;
120 f08fdedc 2003-11-23 devnull int pfd[2];
121 f08fdedc 2003-11-23 devnull int pid;
122 72f66c2d 2011-01-02 rsc Rune r;
123 f08fdedc 2003-11-23 devnull stop = ifs->val?ifs->val->word:"";
124 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
125 f08fdedc 2003-11-23 devnull Xerror("can't make pipe");
126 f08fdedc 2003-11-23 devnull return;
127 f08fdedc 2003-11-23 devnull }
128 f08fdedc 2003-11-23 devnull switch(pid = fork()){
129 f08fdedc 2003-11-23 devnull case -1:
130 f08fdedc 2003-11-23 devnull Xerror("try again");
131 f08fdedc 2003-11-23 devnull close(pfd[PRD]);
132 f08fdedc 2003-11-23 devnull close(pfd[PWR]);
133 f08fdedc 2003-11-23 devnull return;
134 f08fdedc 2003-11-23 devnull case 0:
135 4b241872 2007-03-26 devnull clearwaitpids();
136 f08fdedc 2003-11-23 devnull close(pfd[PRD]);
137 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
138 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[PWR], 1);
139 f08fdedc 2003-11-23 devnull return;
140 f08fdedc 2003-11-23 devnull default:
141 4b241872 2007-03-26 devnull addwaitpid(pid);
142 f08fdedc 2003-11-23 devnull close(pfd[PWR]);
143 f08fdedc 2003-11-23 devnull f = openfd(pfd[PRD]);
144 f08fdedc 2003-11-23 devnull s = wd;
145 f08fdedc 2003-11-23 devnull v = 0;
146 f08fdedc 2003-11-23 devnull while((c = rchr(f))!=EOF){
147 72f66c2d 2011-01-02 rsc if(s != ewd) {
148 72f66c2d 2011-01-02 rsc *s++ = c;
149 72f66c2d 2011-01-02 rsc for(q=stop; *q; q+=n) {
150 72f66c2d 2011-01-02 rsc n = chartorune(&r, q);
151 72f66c2d 2011-01-02 rsc if(s-wd >= n && memcmp(s-n, q, n) == 0) {
152 72f66c2d 2011-01-02 rsc s -= n;
153 72f66c2d 2011-01-02 rsc goto stop;
154 72f66c2d 2011-01-02 rsc }
155 f08fdedc 2003-11-23 devnull }
156 72f66c2d 2011-01-02 rsc continue;
157 f08fdedc 2003-11-23 devnull }
158 72f66c2d 2011-01-02 rsc stop:
159 6886b3cd 2011-02-16 rsc if(s != wd) {
160 6886b3cd 2011-02-16 rsc *s = '\0';
161 6886b3cd 2011-02-16 rsc v = newword(wd, v);
162 6886b3cd 2011-02-16 rsc }
163 72f66c2d 2011-01-02 rsc s = wd;
164 f08fdedc 2003-11-23 devnull }
165 f08fdedc 2003-11-23 devnull if(s!=wd){
166 f08fdedc 2003-11-23 devnull *s='\0';
167 f08fdedc 2003-11-23 devnull v = newword(wd, v);
168 f08fdedc 2003-11-23 devnull }
169 f08fdedc 2003-11-23 devnull closeio(f);
170 f08fdedc 2003-11-23 devnull Waitfor(pid, 0);
171 f08fdedc 2003-11-23 devnull /* v points to reversed arglist -- reverse it onto argv */
172 f08fdedc 2003-11-23 devnull while(v){
173 f08fdedc 2003-11-23 devnull nextv = v->next;
174 f08fdedc 2003-11-23 devnull v->next = runq->argv->words;
175 f08fdedc 2003-11-23 devnull runq->argv->words = v;
176 f08fdedc 2003-11-23 devnull v = nextv;
177 f08fdedc 2003-11-23 devnull }
178 74be4603 2009-08-08 mt4swm p->pc = p->code[p->pc].i;
179 f08fdedc 2003-11-23 devnull return;
180 f08fdedc 2003-11-23 devnull }
181 f08fdedc 2003-11-23 devnull }
182 f08fdedc 2003-11-23 devnull
183 f08fdedc 2003-11-23 devnull void
184 f08fdedc 2003-11-23 devnull Xpipefd(void)
185 f08fdedc 2003-11-23 devnull {
186 f08fdedc 2003-11-23 devnull struct thread *p = runq;
187 4b241872 2007-03-26 devnull int pc = p->pc, pid;
188 f08fdedc 2003-11-23 devnull char name[40];
189 f08fdedc 2003-11-23 devnull int pfd[2];
190 38b62735 2009-09-13 mt4swm struct { int sidefd, mainfd; } fd[2], *r, *w;
191 38b62735 2009-09-13 mt4swm
192 38b62735 2009-09-13 mt4swm r = &fd[0];
193 38b62735 2009-09-13 mt4swm w = &fd[1];
194 38b62735 2009-09-13 mt4swm switch(p->code[pc].i){
195 38b62735 2009-09-13 mt4swm case READ:
196 38b62735 2009-09-13 mt4swm w = nil;
197 38b62735 2009-09-13 mt4swm break;
198 38b62735 2009-09-13 mt4swm case WRITE:
199 38b62735 2009-09-13 mt4swm r = nil;
200 f08fdedc 2003-11-23 devnull }
201 38b62735 2009-09-13 mt4swm
202 38b62735 2009-09-13 mt4swm if(r){
203 38b62735 2009-09-13 mt4swm if(pipe(pfd)<0){
204 38b62735 2009-09-13 mt4swm Xerror("can't get pipe");
205 38b62735 2009-09-13 mt4swm return;
206 38b62735 2009-09-13 mt4swm }
207 38b62735 2009-09-13 mt4swm r->sidefd = pfd[PWR];
208 38b62735 2009-09-13 mt4swm r->mainfd = pfd[PRD];
209 f08fdedc 2003-11-23 devnull }
210 38b62735 2009-09-13 mt4swm if(w){
211 38b62735 2009-09-13 mt4swm if(pipe(pfd)<0){
212 38b62735 2009-09-13 mt4swm Xerror("can't get pipe");
213 38b62735 2009-09-13 mt4swm return;
214 38b62735 2009-09-13 mt4swm }
215 38b62735 2009-09-13 mt4swm w->sidefd = pfd[PRD];
216 38b62735 2009-09-13 mt4swm w->mainfd = pfd[PWR];
217 f08fdedc 2003-11-23 devnull }
218 4b241872 2007-03-26 devnull switch(pid = fork()){
219 f08fdedc 2003-11-23 devnull case -1:
220 f08fdedc 2003-11-23 devnull Xerror("try again");
221 f08fdedc 2003-11-23 devnull break;
222 f08fdedc 2003-11-23 devnull case 0:
223 4b241872 2007-03-26 devnull clearwaitpids();
224 f08fdedc 2003-11-23 devnull start(p->code, pc+2, runq->local);
225 38b62735 2009-09-13 mt4swm if(r){
226 38b62735 2009-09-13 mt4swm close(r->mainfd);
227 38b62735 2009-09-13 mt4swm pushredir(ROPEN, r->sidefd, 1);
228 38b62735 2009-09-13 mt4swm }
229 38b62735 2009-09-13 mt4swm if(w){
230 38b62735 2009-09-13 mt4swm close(w->mainfd);
231 38b62735 2009-09-13 mt4swm pushredir(ROPEN, w->sidefd, 0);
232 38b62735 2009-09-13 mt4swm }
233 f08fdedc 2003-11-23 devnull runq->ret = 0;
234 f08fdedc 2003-11-23 devnull break;
235 f08fdedc 2003-11-23 devnull default:
236 4b241872 2007-03-26 devnull addwaitpid(pid);
237 38b62735 2009-09-13 mt4swm if(w){
238 38b62735 2009-09-13 mt4swm close(w->sidefd);
239 38b62735 2009-09-13 mt4swm pushredir(ROPEN, w->mainfd, w->mainfd); /* so that Xpopredir can close it later */
240 38b62735 2009-09-13 mt4swm strcpy(name, Fdprefix);
241 38b62735 2009-09-13 mt4swm inttoascii(name+strlen(name), w->mainfd);
242 38b62735 2009-09-13 mt4swm pushword(name);
243 38b62735 2009-09-13 mt4swm }
244 38b62735 2009-09-13 mt4swm if(r){
245 38b62735 2009-09-13 mt4swm close(r->sidefd);
246 38b62735 2009-09-13 mt4swm pushredir(ROPEN, r->mainfd, r->mainfd);
247 38b62735 2009-09-13 mt4swm strcpy(name, Fdprefix);
248 38b62735 2009-09-13 mt4swm inttoascii(name+strlen(name), r->mainfd);
249 38b62735 2009-09-13 mt4swm pushword(name);
250 38b62735 2009-09-13 mt4swm }
251 f08fdedc 2003-11-23 devnull p->pc = p->code[pc+1].i;
252 f08fdedc 2003-11-23 devnull break;
253 f08fdedc 2003-11-23 devnull }
254 f08fdedc 2003-11-23 devnull }
255 f08fdedc 2003-11-23 devnull
256 f08fdedc 2003-11-23 devnull void
257 f08fdedc 2003-11-23 devnull Xsubshell(void)
258 f08fdedc 2003-11-23 devnull {
259 f08fdedc 2003-11-23 devnull int pid;
260 f08fdedc 2003-11-23 devnull switch(pid = fork()){
261 f08fdedc 2003-11-23 devnull case -1:
262 f08fdedc 2003-11-23 devnull Xerror("try again");
263 f08fdedc 2003-11-23 devnull break;
264 f08fdedc 2003-11-23 devnull case 0:
265 4b241872 2007-03-26 devnull clearwaitpids();
266 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
267 f08fdedc 2003-11-23 devnull runq->ret = 0;
268 f08fdedc 2003-11-23 devnull break;
269 f08fdedc 2003-11-23 devnull default:
270 4b241872 2007-03-26 devnull addwaitpid(pid);
271 f08fdedc 2003-11-23 devnull Waitfor(pid, 1);
272 f08fdedc 2003-11-23 devnull runq->pc = runq->code[runq->pc].i;
273 f08fdedc 2003-11-23 devnull break;
274 f08fdedc 2003-11-23 devnull }
275 f08fdedc 2003-11-23 devnull }
276 f08fdedc 2003-11-23 devnull
277 f08fdedc 2003-11-23 devnull int
278 f08fdedc 2003-11-23 devnull execforkexec(void)
279 f08fdedc 2003-11-23 devnull {
280 f08fdedc 2003-11-23 devnull int pid;
281 f08fdedc 2003-11-23 devnull int n;
282 f08fdedc 2003-11-23 devnull char buf[ERRMAX];
283 f08fdedc 2003-11-23 devnull
284 f08fdedc 2003-11-23 devnull switch(pid = fork()){
285 f08fdedc 2003-11-23 devnull case -1:
286 f08fdedc 2003-11-23 devnull return -1;
287 f08fdedc 2003-11-23 devnull case 0:
288 4b241872 2007-03-26 devnull clearwaitpids();
289 f08fdedc 2003-11-23 devnull pushword("exec");
290 f08fdedc 2003-11-23 devnull execexec();
291 f08fdedc 2003-11-23 devnull strcpy(buf, "can't exec: ");
292 f08fdedc 2003-11-23 devnull n = strlen(buf);
293 f08fdedc 2003-11-23 devnull errstr(buf+n, ERRMAX-n);
294 f08fdedc 2003-11-23 devnull Exit(buf);
295 f08fdedc 2003-11-23 devnull }
296 4b241872 2007-03-26 devnull addwaitpid(pid);
297 f08fdedc 2003-11-23 devnull return pid;
298 f08fdedc 2003-11-23 devnull }