Blame


1 8f314994 2004-03-02 devnull #define NOPLAN9DEFINES
2 76193d7c 2003-09-30 devnull #include "mk.h"
3 76193d7c 2003-09-30 devnull #include <sys/wait.h>
4 76193d7c 2003-09-30 devnull #include <signal.h>
5 76193d7c 2003-09-30 devnull #include <sys/stat.h>
6 76193d7c 2003-09-30 devnull #include <sys/time.h>
7 76193d7c 2003-09-30 devnull
8 76193d7c 2003-09-30 devnull char *shell = "/bin/sh";
9 76193d7c 2003-09-30 devnull char *shellname = "sh";
10 76193d7c 2003-09-30 devnull
11 76193d7c 2003-09-30 devnull extern char **environ;
12 76193d7c 2003-09-30 devnull
13 76193d7c 2003-09-30 devnull static void
14 76193d7c 2003-09-30 devnull mkperror(char *s)
15 76193d7c 2003-09-30 devnull {
16 76193d7c 2003-09-30 devnull fprint(2, "%s: %r\n", s);
17 76193d7c 2003-09-30 devnull }
18 76193d7c 2003-09-30 devnull
19 76193d7c 2003-09-30 devnull void
20 76193d7c 2003-09-30 devnull readenv(void)
21 76193d7c 2003-09-30 devnull {
22 76193d7c 2003-09-30 devnull char **p, *s;
23 76193d7c 2003-09-30 devnull Word *w;
24 76193d7c 2003-09-30 devnull
25 76193d7c 2003-09-30 devnull for(p = environ; *p; p++){
26 fa325e9b 2020-01-10 cross /* rsc 5/5/2004 -- This misparses fn#cd={whatever}
27 76193d7c 2003-09-30 devnull s = shname(*p);
28 76193d7c 2003-09-30 devnull if(*s == '=') {
29 f1bfc54e 2004-05-14 devnull *s = 0;
30 f1bfc54e 2004-05-14 devnull w = newword(s+1);
31 f1bfc54e 2004-05-14 devnull } else
32 f1bfc54e 2004-05-14 devnull w = newword("");
33 f1bfc54e 2004-05-14 devnull */
34 f1bfc54e 2004-05-14 devnull s = strchr(*p, '=');
35 f1bfc54e 2004-05-14 devnull if(s){
36 76193d7c 2003-09-30 devnull *s = 0;
37 76193d7c 2003-09-30 devnull w = newword(s+1);
38 76193d7c 2003-09-30 devnull } else
39 76193d7c 2003-09-30 devnull w = newword("");
40 76193d7c 2003-09-30 devnull if (symlook(*p, S_INTERNAL, 0))
41 76193d7c 2003-09-30 devnull continue;
42 76193d7c 2003-09-30 devnull s = strdup(*p);
43 76193d7c 2003-09-30 devnull setvar(s, (void *)w);
44 3fe9465a 2006-04-20 devnull symlook(s, S_EXPORTED, (void*)"")->u.ptr = "";
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull }
47 76193d7c 2003-09-30 devnull
48 76193d7c 2003-09-30 devnull /*
49 76193d7c 2003-09-30 devnull * done on child side of fork, so parent's env is not affected
50 76193d7c 2003-09-30 devnull * and we don't care about freeing memory because we're going
51 76193d7c 2003-09-30 devnull * to exec immediately after this.
52 76193d7c 2003-09-30 devnull */
53 76193d7c 2003-09-30 devnull void
54 9aa1c92f 2005-01-04 devnull exportenv(Envy *e, Shell *sh)
55 76193d7c 2003-09-30 devnull {
56 6c17f630 2020-01-14 rsc int w, n;
57 76193d7c 2003-09-30 devnull char **p;
58 6c17f630 2020-01-14 rsc Envy *e1;
59 92a0a8b6 2004-04-21 devnull static char buf[16384];
60 76193d7c 2003-09-30 devnull
61 6c17f630 2020-01-14 rsc n = 0;
62 6c17f630 2020-01-14 rsc for(e1 = e; e1->name; e1++)
63 6c17f630 2020-01-14 rsc n++;
64 6c17f630 2020-01-14 rsc p = Malloc((n+1)*sizeof(char*));
65 6c17f630 2020-01-14 rsc w = 0;
66 6c17f630 2020-01-14 rsc for(; e->name; e++) {
67 6c17f630 2020-01-14 rsc if(sh == &rcshell && (e->values == 0 || e->values->s == 0 || e->values->s[0] == 0))
68 6c17f630 2020-01-14 rsc continue; /* do not write empty string for empty list */
69 76193d7c 2003-09-30 devnull if(e->values)
70 9aa1c92f 2005-01-04 devnull snprint(buf, sizeof buf, "%s=%s", e->name, wtos(e->values, sh->iws));
71 76193d7c 2003-09-30 devnull else
72 92a0a8b6 2004-04-21 devnull snprint(buf, sizeof buf, "%s=", e->name);
73 6c17f630 2020-01-14 rsc p[w++] = strdup(buf);
74 76193d7c 2003-09-30 devnull }
75 6c17f630 2020-01-14 rsc p[w] = 0;
76 76193d7c 2003-09-30 devnull environ = p;
77 76193d7c 2003-09-30 devnull }
78 76193d7c 2003-09-30 devnull
79 76193d7c 2003-09-30 devnull int
80 76193d7c 2003-09-30 devnull waitfor(char *msg)
81 76193d7c 2003-09-30 devnull {
82 76193d7c 2003-09-30 devnull int status;
83 76193d7c 2003-09-30 devnull int pid;
84 76193d7c 2003-09-30 devnull
85 76193d7c 2003-09-30 devnull *msg = 0;
86 76193d7c 2003-09-30 devnull pid = wait(&status);
87 76193d7c 2003-09-30 devnull if(pid > 0) {
88 76193d7c 2003-09-30 devnull if(status&0x7f) {
89 76193d7c 2003-09-30 devnull if(status&0x80)
90 76193d7c 2003-09-30 devnull snprint(msg, ERRMAX, "signal %d, core dumped", status&0x7f);
91 76193d7c 2003-09-30 devnull else
92 76193d7c 2003-09-30 devnull snprint(msg, ERRMAX, "signal %d", status&0x7f);
93 76193d7c 2003-09-30 devnull } else if(status&0xff00)
94 76193d7c 2003-09-30 devnull snprint(msg, ERRMAX, "exit(%d)", (status>>8)&0xff);
95 76193d7c 2003-09-30 devnull }
96 76193d7c 2003-09-30 devnull return pid;
97 76193d7c 2003-09-30 devnull }
98 76193d7c 2003-09-30 devnull
99 76193d7c 2003-09-30 devnull void
100 76193d7c 2003-09-30 devnull expunge(int pid, char *msg)
101 76193d7c 2003-09-30 devnull {
102 76193d7c 2003-09-30 devnull if(strcmp(msg, "interrupt"))
103 76193d7c 2003-09-30 devnull kill(pid, SIGINT);
104 76193d7c 2003-09-30 devnull else
105 76193d7c 2003-09-30 devnull kill(pid, SIGHUP);
106 76193d7c 2003-09-30 devnull }
107 76193d7c 2003-09-30 devnull
108 92a0a8b6 2004-04-21 devnull int mypid;
109 92a0a8b6 2004-04-21 devnull
110 76193d7c 2003-09-30 devnull int
111 9aa1c92f 2005-01-04 devnull shargv(Word *cmd, int extra, char ***pargv)
112 76193d7c 2003-09-30 devnull {
113 9aa1c92f 2005-01-04 devnull char **argv;
114 9aa1c92f 2005-01-04 devnull int i, n;
115 9aa1c92f 2005-01-04 devnull Word *w;
116 9aa1c92f 2005-01-04 devnull
117 9aa1c92f 2005-01-04 devnull n = 0;
118 9aa1c92f 2005-01-04 devnull for(w=cmd; w; w=w->next)
119 9aa1c92f 2005-01-04 devnull n++;
120 fa325e9b 2020-01-10 cross
121 9aa1c92f 2005-01-04 devnull argv = Malloc((n+extra+1)*sizeof(argv[0]));
122 9aa1c92f 2005-01-04 devnull i = 0;
123 9aa1c92f 2005-01-04 devnull for(w=cmd; w; w=w->next)
124 9aa1c92f 2005-01-04 devnull argv[i++] = w->s;
125 9aa1c92f 2005-01-04 devnull argv[n] = 0;
126 9aa1c92f 2005-01-04 devnull *pargv = argv;
127 9aa1c92f 2005-01-04 devnull return n;
128 fa325e9b 2020-01-10 cross }
129 9aa1c92f 2005-01-04 devnull
130 9aa1c92f 2005-01-04 devnull int
131 9aa1c92f 2005-01-04 devnull execsh(char *args, char *cmd, Bufblock *buf, Envy *e, Shell *sh, Word *shellcmd)
132 9aa1c92f 2005-01-04 devnull {
133 9aa1c92f 2005-01-04 devnull char *p, **argv;
134 76193d7c 2003-09-30 devnull int tot, n, pid, in[2], out[2];
135 76193d7c 2003-09-30 devnull
136 76193d7c 2003-09-30 devnull if(buf && pipe(out) < 0){
137 76193d7c 2003-09-30 devnull mkperror("pipe");
138 76193d7c 2003-09-30 devnull Exit();
139 76193d7c 2003-09-30 devnull }
140 76193d7c 2003-09-30 devnull pid = fork();
141 92a0a8b6 2004-04-21 devnull mypid = getpid();
142 76193d7c 2003-09-30 devnull if(pid < 0){
143 76193d7c 2003-09-30 devnull mkperror("mk fork");
144 76193d7c 2003-09-30 devnull Exit();
145 76193d7c 2003-09-30 devnull }
146 76193d7c 2003-09-30 devnull if(pid == 0){
147 76193d7c 2003-09-30 devnull if(buf)
148 76193d7c 2003-09-30 devnull close(out[0]);
149 76193d7c 2003-09-30 devnull if(pipe(in) < 0){
150 76193d7c 2003-09-30 devnull mkperror("pipe");
151 76193d7c 2003-09-30 devnull Exit();
152 76193d7c 2003-09-30 devnull }
153 76193d7c 2003-09-30 devnull pid = fork();
154 76193d7c 2003-09-30 devnull if(pid < 0){
155 76193d7c 2003-09-30 devnull mkperror("mk fork");
156 76193d7c 2003-09-30 devnull Exit();
157 76193d7c 2003-09-30 devnull }
158 76193d7c 2003-09-30 devnull if(pid != 0){
159 76193d7c 2003-09-30 devnull dup2(in[0], 0);
160 76193d7c 2003-09-30 devnull if(buf){
161 76193d7c 2003-09-30 devnull dup2(out[1], 1);
162 76193d7c 2003-09-30 devnull close(out[1]);
163 76193d7c 2003-09-30 devnull }
164 76193d7c 2003-09-30 devnull close(in[0]);
165 76193d7c 2003-09-30 devnull close(in[1]);
166 76193d7c 2003-09-30 devnull if (e)
167 9aa1c92f 2005-01-04 devnull exportenv(e, sh);
168 9aa1c92f 2005-01-04 devnull n = shargv(shellcmd, 1, &argv);
169 9aa1c92f 2005-01-04 devnull argv[n++] = args;
170 9aa1c92f 2005-01-04 devnull argv[n] = 0;
171 9aa1c92f 2005-01-04 devnull execvp(argv[0], argv);
172 76193d7c 2003-09-30 devnull mkperror(shell);
173 76193d7c 2003-09-30 devnull _exit(1);
174 76193d7c 2003-09-30 devnull }
175 76193d7c 2003-09-30 devnull close(out[1]);
176 76193d7c 2003-09-30 devnull close(in[0]);
177 76193d7c 2003-09-30 devnull if(DEBUG(D_EXEC))
178 76193d7c 2003-09-30 devnull fprint(1, "starting: %s\n", cmd);
179 76193d7c 2003-09-30 devnull p = cmd+strlen(cmd);
180 76193d7c 2003-09-30 devnull while(cmd < p){
181 76193d7c 2003-09-30 devnull n = write(in[1], cmd, p-cmd);
182 76193d7c 2003-09-30 devnull if(n < 0)
183 76193d7c 2003-09-30 devnull break;
184 76193d7c 2003-09-30 devnull cmd += n;
185 76193d7c 2003-09-30 devnull }
186 76193d7c 2003-09-30 devnull close(in[1]);
187 76193d7c 2003-09-30 devnull _exit(0);
188 76193d7c 2003-09-30 devnull }
189 76193d7c 2003-09-30 devnull if(buf){
190 76193d7c 2003-09-30 devnull close(out[1]);
191 76193d7c 2003-09-30 devnull tot = 0;
192 76193d7c 2003-09-30 devnull for(;;){
193 76193d7c 2003-09-30 devnull if (buf->current >= buf->end)
194 76193d7c 2003-09-30 devnull growbuf(buf);
195 76193d7c 2003-09-30 devnull n = read(out[0], buf->current, buf->end-buf->current);
196 76193d7c 2003-09-30 devnull if(n <= 0)
197 76193d7c 2003-09-30 devnull break;
198 76193d7c 2003-09-30 devnull buf->current += n;
199 76193d7c 2003-09-30 devnull tot += n;
200 76193d7c 2003-09-30 devnull }
201 76193d7c 2003-09-30 devnull if (tot && buf->current[-1] == '\n')
202 76193d7c 2003-09-30 devnull buf->current--;
203 76193d7c 2003-09-30 devnull close(out[0]);
204 76193d7c 2003-09-30 devnull }
205 76193d7c 2003-09-30 devnull return pid;
206 76193d7c 2003-09-30 devnull }
207 76193d7c 2003-09-30 devnull
208 76193d7c 2003-09-30 devnull int
209 9aa1c92f 2005-01-04 devnull pipecmd(char *cmd, Envy *e, int *fd, Shell *sh, Word *shellcmd)
210 76193d7c 2003-09-30 devnull {
211 76193d7c 2003-09-30 devnull int pid, pfd[2];
212 9aa1c92f 2005-01-04 devnull int n;
213 9aa1c92f 2005-01-04 devnull char **argv;
214 76193d7c 2003-09-30 devnull
215 76193d7c 2003-09-30 devnull if(DEBUG(D_EXEC))
216 76193d7c 2003-09-30 devnull fprint(1, "pipecmd='%s'\n", cmd);/**/
217 76193d7c 2003-09-30 devnull
218 76193d7c 2003-09-30 devnull if(fd && pipe(pfd) < 0){
219 76193d7c 2003-09-30 devnull mkperror("pipe");
220 76193d7c 2003-09-30 devnull Exit();
221 76193d7c 2003-09-30 devnull }
222 76193d7c 2003-09-30 devnull pid = fork();
223 76193d7c 2003-09-30 devnull if(pid < 0){
224 76193d7c 2003-09-30 devnull mkperror("mk fork");
225 76193d7c 2003-09-30 devnull Exit();
226 76193d7c 2003-09-30 devnull }
227 76193d7c 2003-09-30 devnull if(pid == 0){
228 76193d7c 2003-09-30 devnull if(fd){
229 76193d7c 2003-09-30 devnull close(pfd[0]);
230 76193d7c 2003-09-30 devnull dup2(pfd[1], 1);
231 76193d7c 2003-09-30 devnull close(pfd[1]);
232 76193d7c 2003-09-30 devnull }
233 76193d7c 2003-09-30 devnull if(e)
234 9aa1c92f 2005-01-04 devnull exportenv(e, sh);
235 9aa1c92f 2005-01-04 devnull n = shargv(shellcmd, 2, &argv);
236 9aa1c92f 2005-01-04 devnull argv[n++] = "-c";
237 9aa1c92f 2005-01-04 devnull argv[n++] = cmd;
238 9aa1c92f 2005-01-04 devnull argv[n] = 0;
239 9aa1c92f 2005-01-04 devnull execvp(argv[0], argv);
240 76193d7c 2003-09-30 devnull mkperror(shell);
241 76193d7c 2003-09-30 devnull _exit(1);
242 76193d7c 2003-09-30 devnull }
243 76193d7c 2003-09-30 devnull if(fd){
244 76193d7c 2003-09-30 devnull close(pfd[1]);
245 76193d7c 2003-09-30 devnull *fd = pfd[0];
246 76193d7c 2003-09-30 devnull }
247 76193d7c 2003-09-30 devnull return pid;
248 76193d7c 2003-09-30 devnull }
249 76193d7c 2003-09-30 devnull
250 76193d7c 2003-09-30 devnull void
251 76193d7c 2003-09-30 devnull Exit(void)
252 76193d7c 2003-09-30 devnull {
253 76193d7c 2003-09-30 devnull while(wait(0) >= 0)
254 76193d7c 2003-09-30 devnull ;
255 76193d7c 2003-09-30 devnull exits("error");
256 76193d7c 2003-09-30 devnull }
257 76193d7c 2003-09-30 devnull
258 76193d7c 2003-09-30 devnull static struct
259 76193d7c 2003-09-30 devnull {
260 76193d7c 2003-09-30 devnull int sig;
261 76193d7c 2003-09-30 devnull char *msg;
262 76193d7c 2003-09-30 devnull } sigmsgs[] =
263 76193d7c 2003-09-30 devnull {
264 76193d7c 2003-09-30 devnull SIGALRM, "alarm",
265 76193d7c 2003-09-30 devnull SIGFPE, "sys: fp: fptrap",
266 76193d7c 2003-09-30 devnull SIGPIPE, "sys: write on closed pipe",
267 76193d7c 2003-09-30 devnull SIGILL, "sys: trap: illegal instruction",
268 cbeb0b26 2006-04-01 devnull /* SIGSEGV, "sys: segmentation violation", */
269 76193d7c 2003-09-30 devnull 0, 0
270 76193d7c 2003-09-30 devnull };
271 76193d7c 2003-09-30 devnull
272 76193d7c 2003-09-30 devnull static void
273 76193d7c 2003-09-30 devnull notifyf(int sig)
274 76193d7c 2003-09-30 devnull {
275 76193d7c 2003-09-30 devnull int i;
276 76193d7c 2003-09-30 devnull
277 76193d7c 2003-09-30 devnull for(i = 0; sigmsgs[i].msg; i++)
278 76193d7c 2003-09-30 devnull if(sigmsgs[i].sig == sig)
279 76193d7c 2003-09-30 devnull killchildren(sigmsgs[i].msg);
280 76193d7c 2003-09-30 devnull
281 76193d7c 2003-09-30 devnull /* should never happen */
282 76193d7c 2003-09-30 devnull signal(sig, SIG_DFL);
283 76193d7c 2003-09-30 devnull kill(getpid(), sig);
284 76193d7c 2003-09-30 devnull }
285 76193d7c 2003-09-30 devnull
286 76193d7c 2003-09-30 devnull void
287 2b604081 2005-05-07 devnull catchnotes(void)
288 76193d7c 2003-09-30 devnull {
289 76193d7c 2003-09-30 devnull int i;
290 76193d7c 2003-09-30 devnull
291 76193d7c 2003-09-30 devnull for(i = 0; sigmsgs[i].msg; i++)
292 76193d7c 2003-09-30 devnull signal(sigmsgs[i].sig, notifyf);
293 76193d7c 2003-09-30 devnull }
294 76193d7c 2003-09-30 devnull
295 76193d7c 2003-09-30 devnull char*
296 76193d7c 2003-09-30 devnull maketmp(int *pfd)
297 76193d7c 2003-09-30 devnull {
298 76193d7c 2003-09-30 devnull static char temp[] = "/tmp/mkargXXXXXX";
299 76193d7c 2003-09-30 devnull static char buf[100];
300 76193d7c 2003-09-30 devnull int fd;
301 76193d7c 2003-09-30 devnull
302 76193d7c 2003-09-30 devnull strcpy(buf, temp);
303 76193d7c 2003-09-30 devnull fd = mkstemp(buf);
304 76193d7c 2003-09-30 devnull if(fd < 0)
305 76193d7c 2003-09-30 devnull return 0;
306 76193d7c 2003-09-30 devnull *pfd = fd;
307 76193d7c 2003-09-30 devnull return buf;
308 76193d7c 2003-09-30 devnull }
309 76193d7c 2003-09-30 devnull
310 76193d7c 2003-09-30 devnull int
311 76193d7c 2003-09-30 devnull chgtime(char *name)
312 76193d7c 2003-09-30 devnull {
313 76193d7c 2003-09-30 devnull if(access(name, 0) >= 0)
314 76193d7c 2003-09-30 devnull return utimes(name, 0);
315 76193d7c 2003-09-30 devnull return close(creat(name, 0666));
316 76193d7c 2003-09-30 devnull }
317 76193d7c 2003-09-30 devnull
318 76193d7c 2003-09-30 devnull void
319 76193d7c 2003-09-30 devnull rcopy(char **to, Resub *match, int n)
320 76193d7c 2003-09-30 devnull {
321 76193d7c 2003-09-30 devnull int c;
322 76193d7c 2003-09-30 devnull char *p;
323 76193d7c 2003-09-30 devnull
324 76193d7c 2003-09-30 devnull *to = match->s.sp; /* stem0 matches complete target */
325 76193d7c 2003-09-30 devnull for(to++, match++; --n > 0; to++, match++){
326 76193d7c 2003-09-30 devnull if(match->s.sp && match->e.ep){
327 76193d7c 2003-09-30 devnull p = match->e.ep;
328 76193d7c 2003-09-30 devnull c = *p;
329 76193d7c 2003-09-30 devnull *p = 0;
330 76193d7c 2003-09-30 devnull *to = strdup(match->s.sp);
331 76193d7c 2003-09-30 devnull *p = c;
332 76193d7c 2003-09-30 devnull }
333 76193d7c 2003-09-30 devnull else
334 76193d7c 2003-09-30 devnull *to = 0;
335 76193d7c 2003-09-30 devnull }
336 76193d7c 2003-09-30 devnull }
337 76193d7c 2003-09-30 devnull
338 0753502e 2005-01-23 devnull unsigned long
339 76193d7c 2003-09-30 devnull mkmtime(char *name)
340 76193d7c 2003-09-30 devnull {
341 76193d7c 2003-09-30 devnull struct stat st;
342 76193d7c 2003-09-30 devnull
343 76193d7c 2003-09-30 devnull if(stat(name, &st) < 0)
344 76193d7c 2003-09-30 devnull return 0;
345 76193d7c 2003-09-30 devnull
346 76193d7c 2003-09-30 devnull return st.st_mtime;
347 76193d7c 2003-09-30 devnull }