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"
7 f08fdedc 2003-11-23 devnull int havefork = 0;
9 f08fdedc 2003-11-23 devnull static char **
10 f08fdedc 2003-11-23 devnull rcargv(char *s)
12 f08fdedc 2003-11-23 devnull int argc;
13 f08fdedc 2003-11-23 devnull char **argv;
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";
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;
33 f08fdedc 2003-11-23 devnull Xasync(void)
35 f08fdedc 2003-11-23 devnull uint pid;
36 f08fdedc 2003-11-23 devnull char buf[20], **argv;
38 f08fdedc 2003-11-23 devnull Updenv();
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);
44 f08fdedc 2003-11-23 devnull if(pid == 0) {
45 f08fdedc 2003-11-23 devnull Xerror("proc failed");
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));
55 f08fdedc 2003-11-23 devnull Xbackq(void)
57 f08fdedc 2003-11-23 devnull char wd[8193], **argv;
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];
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");
72 f08fdedc 2003-11-23 devnull Updenv();
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);
78 f08fdedc 2003-11-23 devnull close(pfd[1]);
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]);
86 f08fdedc 2003-11-23 devnull f = openfd(pfd[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){
93 f08fdedc 2003-11-23 devnull v=newword(wd, v);
97 f08fdedc 2003-11-23 devnull else *s++=c;
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);
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;
112 f08fdedc 2003-11-23 devnull runq->pc++;
116 f08fdedc 2003-11-23 devnull Xpipe(void)
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;
124 f08fdedc 2003-11-23 devnull if(pipe(pfd)<0){
125 f08fdedc 2003-11-23 devnull Xerror1("can't get pipe");
129 f08fdedc 2003-11-23 devnull Updenv();
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]);
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]);
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;
149 f08fdedc 2003-11-23 devnull Xpipefd(void)
151 f08fdedc 2003-11-23 devnull Abort();
155 f08fdedc 2003-11-23 devnull Xsubshell(void)
157 f08fdedc 2003-11-23 devnull char **argv;
158 f08fdedc 2003-11-23 devnull int pid;
160 f08fdedc 2003-11-23 devnull Updenv();
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);
166 f08fdedc 2003-11-23 devnull if(pid < 0) {
167 f08fdedc 2003-11-23 devnull Xerror("proc failed");
171 f08fdedc 2003-11-23 devnull Waitfor(pid, 1);
172 f08fdedc 2003-11-23 devnull runq->pc++;
176 f08fdedc 2003-11-23 devnull * start a process running the cmd on the stack and return its pid.
179 f08fdedc 2003-11-23 devnull execforkexec(void)
181 f08fdedc 2003-11-23 devnull char **argv;
182 f08fdedc 2003-11-23 devnull char file[1024];
184 f08fdedc 2003-11-23 devnull word *path;
185 f08fdedc 2003-11-23 devnull int pid;
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);
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, "/");
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;
209 f08fdedc 2003-11-23 devnull free(argv);
210 f08fdedc 2003-11-23 devnull return -1;