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 = 0;
8 f08fdedc 2003-11-23 devnull
9 f08fdedc 2003-11-23 devnull static char **
10 f08fdedc 2003-11-23 devnull rcargv(char *s)
11 f08fdedc 2003-11-23 devnull {
12 f08fdedc 2003-11-23 devnull int argc;
13 f08fdedc 2003-11-23 devnull char **argv;
14 f08fdedc 2003-11-23 devnull word *p;
15 f08fdedc 2003-11-23 devnull
16 f08fdedc 2003-11-23 devnull p = vlook("*")->val;
17 f08fdedc 2003-11-23 devnull argv = malloc((count(p)+6)*sizeof(char*));
18 f08fdedc 2003-11-23 devnull argc = 0;
19 f08fdedc 2003-11-23 devnull argv[argc++] = argv0;
20 f08fdedc 2003-11-23 devnull if(flag['e'])
21 f08fdedc 2003-11-23 devnull argv[argc++] = "-Se";
22 f08fdedc 2003-11-23 devnull else
23 f08fdedc 2003-11-23 devnull argv[argc++] = "-S";
24 f08fdedc 2003-11-23 devnull argv[argc++] = "-c";
25 f08fdedc 2003-11-23 devnull argv[argc++] = s;
26 f08fdedc 2003-11-23 devnull for(p = vlook("*")->val; p; p = p->next)
27 f08fdedc 2003-11-23 devnull argv[argc++] = p->word;
28 f08fdedc 2003-11-23 devnull argv[argc] = 0;
29 f08fdedc 2003-11-23 devnull return argv;
30 f08fdedc 2003-11-23 devnull }
31 f08fdedc 2003-11-23 devnull
32 f08fdedc 2003-11-23 devnull void
33 f08fdedc 2003-11-23 devnull Xasync(void)
34 f08fdedc 2003-11-23 devnull {
35 f08fdedc 2003-11-23 devnull uint pid;
36 f08fdedc 2003-11-23 devnull char buf[20], **argv;
37 f08fdedc 2003-11-23 devnull
38 f08fdedc 2003-11-23 devnull Updenv();
39 f08fdedc 2003-11-23 devnull
40 f08fdedc 2003-11-23 devnull argv = rcargv(runq->code[runq->pc].s);
41 f08fdedc 2003-11-23 devnull pid = ForkExecute(argv0, argv, -1, 1, 2);
42 f08fdedc 2003-11-23 devnull free(argv);
43 f08fdedc 2003-11-23 devnull
44 f08fdedc 2003-11-23 devnull if(pid == 0) {
45 f08fdedc 2003-11-23 devnull Xerror("proc failed");
46 f08fdedc 2003-11-23 devnull return;
47 f08fdedc 2003-11-23 devnull }
48 f08fdedc 2003-11-23 devnull
49 f08fdedc 2003-11-23 devnull runq->pc++;
50 f08fdedc 2003-11-23 devnull sprint(buf, "%d", pid);
51 f08fdedc 2003-11-23 devnull setvar("apid", newword(buf, (word *)0));
52 f08fdedc 2003-11-23 devnull }
53 f08fdedc 2003-11-23 devnull
54 f08fdedc 2003-11-23 devnull void
55 f08fdedc 2003-11-23 devnull Xbackq(void)
56 f08fdedc 2003-11-23 devnull {
57 f08fdedc 2003-11-23 devnull char wd[8193], **argv;
58 f08fdedc 2003-11-23 devnull int c;
59 f08fdedc 2003-11-23 devnull char *s, *ewd=&wd[8192], *stop;
60 f08fdedc 2003-11-23 devnull struct io *f;
61 f08fdedc 2003-11-23 devnull var *ifs = vlook("ifs");
62 f08fdedc 2003-11-23 devnull word *v, *nextv;
63 f08fdedc 2003-11-23 devnull int pfd[2];
64 f08fdedc 2003-11-23 devnull int pid;
65 f08fdedc 2003-11-23 devnull
66 f08fdedc 2003-11-23 devnull stop = ifs->val?ifs->val->word:"";
67 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
68 f08fdedc 2003-11-23 devnull Xerror("can't make pipe");
69 f08fdedc 2003-11-23 devnull return;
70 f08fdedc 2003-11-23 devnull }
71 f08fdedc 2003-11-23 devnull
72 f08fdedc 2003-11-23 devnull Updenv();
73 f08fdedc 2003-11-23 devnull
74 f08fdedc 2003-11-23 devnull argv = rcargv(runq->code[runq->pc].s);
75 f08fdedc 2003-11-23 devnull pid = ForkExecute(argv0, argv, -1, pfd[1], 2);
76 f08fdedc 2003-11-23 devnull free(argv);
77 f08fdedc 2003-11-23 devnull
78 f08fdedc 2003-11-23 devnull close(pfd[1]);
79 f08fdedc 2003-11-23 devnull
80 f08fdedc 2003-11-23 devnull if(pid == 0) {
81 f08fdedc 2003-11-23 devnull Xerror("proc failed");
82 f08fdedc 2003-11-23 devnull close(pfd[0]);
83 f08fdedc 2003-11-23 devnull return;
84 f08fdedc 2003-11-23 devnull }
85 f08fdedc 2003-11-23 devnull
86 f08fdedc 2003-11-23 devnull f = openfd(pfd[0]);
87 f08fdedc 2003-11-23 devnull s = wd;
88 f08fdedc 2003-11-23 devnull v = 0;
89 f08fdedc 2003-11-23 devnull while((c=rchr(f))!=EOF){
90 f08fdedc 2003-11-23 devnull if(strchr(stop, c) || s==ewd){
91 f08fdedc 2003-11-23 devnull if(s!=wd){
92 f08fdedc 2003-11-23 devnull *s='\0';
93 f08fdedc 2003-11-23 devnull v=newword(wd, v);
94 f08fdedc 2003-11-23 devnull s=wd;
95 f08fdedc 2003-11-23 devnull }
96 f08fdedc 2003-11-23 devnull }
97 f08fdedc 2003-11-23 devnull else *s++=c;
98 f08fdedc 2003-11-23 devnull }
99 f08fdedc 2003-11-23 devnull if(s!=wd){
100 f08fdedc 2003-11-23 devnull *s='\0';
101 f08fdedc 2003-11-23 devnull v=newword(wd, v);
102 f08fdedc 2003-11-23 devnull }
103 f08fdedc 2003-11-23 devnull closeio(f);
104 f08fdedc 2003-11-23 devnull Waitfor(pid, 1);
105 f08fdedc 2003-11-23 devnull /* v points to reversed arglist -- reverse it onto argv */
106 f08fdedc 2003-11-23 devnull while(v){
107 f08fdedc 2003-11-23 devnull nextv=v->next;
108 f08fdedc 2003-11-23 devnull v->next=runq->argv->words;
109 f08fdedc 2003-11-23 devnull runq->argv->words=v;
110 f08fdedc 2003-11-23 devnull v=nextv;
111 f08fdedc 2003-11-23 devnull }
112 f08fdedc 2003-11-23 devnull runq->pc++;
113 f08fdedc 2003-11-23 devnull }
114 f08fdedc 2003-11-23 devnull
115 f08fdedc 2003-11-23 devnull void
116 f08fdedc 2003-11-23 devnull Xpipe(void)
117 f08fdedc 2003-11-23 devnull {
118 f08fdedc 2003-11-23 devnull thread *p=runq;
119 f08fdedc 2003-11-23 devnull int pc=p->pc, pid;
120 f08fdedc 2003-11-23 devnull int rfd=p->code[pc+1].i;
121 f08fdedc 2003-11-23 devnull int pfd[2];
122 f08fdedc 2003-11-23 devnull char **argv;
123 f08fdedc 2003-11-23 devnull
124 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
125 f08fdedc 2003-11-23 devnull Xerror1("can't get pipe");
126 f08fdedc 2003-11-23 devnull return;
127 f08fdedc 2003-11-23 devnull }
128 f08fdedc 2003-11-23 devnull
129 f08fdedc 2003-11-23 devnull Updenv();
130 f08fdedc 2003-11-23 devnull
131 f08fdedc 2003-11-23 devnull argv = rcargv(runq->code[pc+2].s);
132 f08fdedc 2003-11-23 devnull pid = ForkExecute(argv0, argv, 0, pfd[1], 2);
133 f08fdedc 2003-11-23 devnull free(argv);
134 f08fdedc 2003-11-23 devnull close(pfd[1]);
135 f08fdedc 2003-11-23 devnull
136 f08fdedc 2003-11-23 devnull if(pid == 0) {
137 f08fdedc 2003-11-23 devnull Xerror("proc failed");
138 f08fdedc 2003-11-23 devnull close(pfd[0]);
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 start(p->code, pc+4, runq->local);
143 f08fdedc 2003-11-23 devnull pushredir(ROPEN, pfd[0], rfd);
144 f08fdedc 2003-11-23 devnull p->pc=p->code[pc+3].i;
145 f08fdedc 2003-11-23 devnull p->pid=pid;
146 f08fdedc 2003-11-23 devnull }
147 f08fdedc 2003-11-23 devnull
148 f08fdedc 2003-11-23 devnull void
149 f08fdedc 2003-11-23 devnull Xpipefd(void)
150 f08fdedc 2003-11-23 devnull {
151 f08fdedc 2003-11-23 devnull Abort();
152 f08fdedc 2003-11-23 devnull }
153 f08fdedc 2003-11-23 devnull
154 f08fdedc 2003-11-23 devnull void
155 f08fdedc 2003-11-23 devnull Xsubshell(void)
156 f08fdedc 2003-11-23 devnull {
157 f08fdedc 2003-11-23 devnull char **argv;
158 f08fdedc 2003-11-23 devnull int pid;
159 f08fdedc 2003-11-23 devnull
160 f08fdedc 2003-11-23 devnull Updenv();
161 f08fdedc 2003-11-23 devnull
162 f08fdedc 2003-11-23 devnull argv = rcargv(runq->code[runq->pc].s);
163 f08fdedc 2003-11-23 devnull pid = ForkExecute(argv0, argv, -1, 1, 2);
164 f08fdedc 2003-11-23 devnull free(argv);
165 f08fdedc 2003-11-23 devnull
166 f08fdedc 2003-11-23 devnull if(pid < 0) {
167 f08fdedc 2003-11-23 devnull Xerror("proc failed");
168 f08fdedc 2003-11-23 devnull return;
169 f08fdedc 2003-11-23 devnull }
170 f08fdedc 2003-11-23 devnull
171 f08fdedc 2003-11-23 devnull Waitfor(pid, 1);
172 f08fdedc 2003-11-23 devnull runq->pc++;
173 f08fdedc 2003-11-23 devnull }
174 f08fdedc 2003-11-23 devnull
175 f08fdedc 2003-11-23 devnull /*
176 f08fdedc 2003-11-23 devnull * start a process running the cmd on the stack and return its pid.
177 f08fdedc 2003-11-23 devnull */
178 f08fdedc 2003-11-23 devnull int
179 f08fdedc 2003-11-23 devnull execforkexec(void)
180 f08fdedc 2003-11-23 devnull {
181 f08fdedc 2003-11-23 devnull char **argv;
182 f08fdedc 2003-11-23 devnull char file[1024];
183 f08fdedc 2003-11-23 devnull int nc;
184 f08fdedc 2003-11-23 devnull word *path;
185 f08fdedc 2003-11-23 devnull int pid;
186 f08fdedc 2003-11-23 devnull
187 f08fdedc 2003-11-23 devnull if(runq->argv->words==0)
188 f08fdedc 2003-11-23 devnull return -1;
189 f08fdedc 2003-11-23 devnull argv = mkargv(runq->argv->words);
190 f08fdedc 2003-11-23 devnull
191 f08fdedc 2003-11-23 devnull for(path = searchpath(runq->argv->words->word);path;path = path->next){
192 f08fdedc 2003-11-23 devnull nc = strlen(path->word);
193 f08fdedc 2003-11-23 devnull if(nc<sizeof(file)){
194 f08fdedc 2003-11-23 devnull strcpy(file, path->word);
195 f08fdedc 2003-11-23 devnull if(file[0]){
196 f08fdedc 2003-11-23 devnull strcat(file, "/");
197 f08fdedc 2003-11-23 devnull nc++;
198 f08fdedc 2003-11-23 devnull }
199 f08fdedc 2003-11-23 devnull if(nc+strlen(argv[1])<sizeof(file)){
200 f08fdedc 2003-11-23 devnull strcat(file, argv[1]);
201 f08fdedc 2003-11-23 devnull pid = ForkExecute(file, argv+1, mapfd(0), mapfd(1), mapfd(2));
202 f08fdedc 2003-11-23 devnull if(pid >= 0){
203 f08fdedc 2003-11-23 devnull free(argv);
204 f08fdedc 2003-11-23 devnull return pid;
205 f08fdedc 2003-11-23 devnull }
206 f08fdedc 2003-11-23 devnull }
207 f08fdedc 2003-11-23 devnull }
208 f08fdedc 2003-11-23 devnull }
209 f08fdedc 2003-11-23 devnull free(argv);
210 f08fdedc 2003-11-23 devnull return -1;
211 f08fdedc 2003-11-23 devnull }