Blame


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"
8 f08fdedc 2003-11-23 devnull
9 f08fdedc 2003-11-23 devnull int havefork = 1;
10 f08fdedc 2003-11-23 devnull
11 f08fdedc 2003-11-23 devnull void
12 f08fdedc 2003-11-23 devnull Xasync(void)
13 f08fdedc 2003-11-23 devnull {
14 f08fdedc 2003-11-23 devnull int null = open("/dev/null", 0);
15 f08fdedc 2003-11-23 devnull int pid;
16 4ee543e5 2005-03-18 devnull int tcpgrp, pgrp;
17 f08fdedc 2003-11-23 devnull char npid[10];
18 4ee543e5 2005-03-18 devnull
19 f08fdedc 2003-11-23 devnull if(null<0){
20 f08fdedc 2003-11-23 devnull Xerror("Can't open /dev/null\n");
21 f08fdedc 2003-11-23 devnull return;
22 f08fdedc 2003-11-23 devnull }
23 f08fdedc 2003-11-23 devnull switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){
24 f08fdedc 2003-11-23 devnull case -1:
25 f08fdedc 2003-11-23 devnull close(null);
26 f08fdedc 2003-11-23 devnull Xerror("try again");
27 f08fdedc 2003-11-23 devnull break;
28 f08fdedc 2003-11-23 devnull case 0:
29 4ee543e5 2005-03-18 devnull /*
30 4ee543e5 2005-03-18 devnull * Should make reads of tty fail, writes succeed.
31 4ee543e5 2005-03-18 devnull */
32 4ee543e5 2005-03-18 devnull signal(SIGTTIN, SIG_IGN);
33 4ee543e5 2005-03-18 devnull signal(SIGTTOU, SIG_IGN);
34 4ee543e5 2005-03-18 devnull
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;
38 f08fdedc 2003-11-23 devnull break;
39 f08fdedc 2003-11-23 devnull default:
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));
44 f08fdedc 2003-11-23 devnull break;
45 f08fdedc 2003-11-23 devnull }
46 f08fdedc 2003-11-23 devnull }
47 f08fdedc 2003-11-23 devnull
48 f08fdedc 2003-11-23 devnull void
49 f08fdedc 2003-11-23 devnull Xpipe(void)
50 f08fdedc 2003-11-23 devnull {
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");
58 f08fdedc 2003-11-23 devnull return;
59 f08fdedc 2003-11-23 devnull }
60 f08fdedc 2003-11-23 devnull switch(forkid = fork()){
61 f08fdedc 2003-11-23 devnull case -1:
62 f08fdedc 2003-11-23 devnull Xerror("try again");
63 f08fdedc 2003-11-23 devnull break;
64 f08fdedc 2003-11-23 devnull case 0:
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);
69 f08fdedc 2003-11-23 devnull break;
70 f08fdedc 2003-11-23 devnull default:
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;
76 f08fdedc 2003-11-23 devnull break;
77 f08fdedc 2003-11-23 devnull }
78 f08fdedc 2003-11-23 devnull }
79 f08fdedc 2003-11-23 devnull
80 f08fdedc 2003-11-23 devnull /*
81 f08fdedc 2003-11-23 devnull * Who should wait for the exit from the fork?
82 f08fdedc 2003-11-23 devnull */
83 f08fdedc 2003-11-23 devnull void
84 f08fdedc 2003-11-23 devnull Xbackq(void)
85 f08fdedc 2003-11-23 devnull {
86 f08fdedc 2003-11-23 devnull char wd[8193];
87 f08fdedc 2003-11-23 devnull int c;
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];
93 f08fdedc 2003-11-23 devnull int pid;
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");
97 f08fdedc 2003-11-23 devnull return;
98 f08fdedc 2003-11-23 devnull }
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]);
104 f08fdedc 2003-11-23 devnull return;
105 f08fdedc 2003-11-23 devnull case 0:
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);
109 f08fdedc 2003-11-23 devnull return;
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]);
113 f08fdedc 2003-11-23 devnull s = wd;
114 f08fdedc 2003-11-23 devnull v = 0;
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);
120 f08fdedc 2003-11-23 devnull s = wd;
121 f08fdedc 2003-11-23 devnull }
122 f08fdedc 2003-11-23 devnull }
123 f08fdedc 2003-11-23 devnull else *s++=c;
124 f08fdedc 2003-11-23 devnull }
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);
128 f08fdedc 2003-11-23 devnull }
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;
137 f08fdedc 2003-11-23 devnull }
138 f08fdedc 2003-11-23 devnull runq->pc = runq->code[runq->pc].i;
139 f08fdedc 2003-11-23 devnull return;
140 f08fdedc 2003-11-23 devnull }
141 f08fdedc 2003-11-23 devnull }
142 f08fdedc 2003-11-23 devnull
143 f08fdedc 2003-11-23 devnull void
144 f08fdedc 2003-11-23 devnull Xpipefd(void)
145 f08fdedc 2003-11-23 devnull {
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");
153 f08fdedc 2003-11-23 devnull return;
154 f08fdedc 2003-11-23 devnull }
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];
158 f08fdedc 2003-11-23 devnull }
159 f08fdedc 2003-11-23 devnull else{
160 f08fdedc 2003-11-23 devnull sidefd = pfd[PRD];
161 f08fdedc 2003-11-23 devnull mainfd = pfd[PWR];
162 f08fdedc 2003-11-23 devnull }
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");
166 f08fdedc 2003-11-23 devnull break;
167 f08fdedc 2003-11-23 devnull case 0:
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;
172 f08fdedc 2003-11-23 devnull break;
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;
180 f08fdedc 2003-11-23 devnull break;
181 f08fdedc 2003-11-23 devnull }
182 f08fdedc 2003-11-23 devnull }
183 f08fdedc 2003-11-23 devnull
184 f08fdedc 2003-11-23 devnull void
185 f08fdedc 2003-11-23 devnull Xsubshell(void)
186 f08fdedc 2003-11-23 devnull {
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");
191 f08fdedc 2003-11-23 devnull break;
192 f08fdedc 2003-11-23 devnull case 0:
193 f08fdedc 2003-11-23 devnull start(runq->code, runq->pc+1, runq->local);
194 f08fdedc 2003-11-23 devnull runq->ret = 0;
195 f08fdedc 2003-11-23 devnull break;
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;
199 f08fdedc 2003-11-23 devnull break;
200 f08fdedc 2003-11-23 devnull }
201 f08fdedc 2003-11-23 devnull }
202 f08fdedc 2003-11-23 devnull
203 f08fdedc 2003-11-23 devnull int
204 f08fdedc 2003-11-23 devnull execforkexec(void)
205 f08fdedc 2003-11-23 devnull {
206 f08fdedc 2003-11-23 devnull int pid;
207 f08fdedc 2003-11-23 devnull int n;
208 f08fdedc 2003-11-23 devnull char buf[ERRMAX];
209 f08fdedc 2003-11-23 devnull
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;
213 f08fdedc 2003-11-23 devnull case 0:
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);
220 f08fdedc 2003-11-23 devnull }
221 f08fdedc 2003-11-23 devnull return pid;
222 f08fdedc 2003-11-23 devnull }