Blame


1 f08fdedc 2003-11-23 devnull /*
2 f08fdedc 2003-11-23 devnull * Plan 9 versions of system-specific functions
3 f08fdedc 2003-11-23 devnull * By convention, exported routines herein have names beginning with an
4 f08fdedc 2003-11-23 devnull * upper case letter.
5 f08fdedc 2003-11-23 devnull */
6 f08fdedc 2003-11-23 devnull #include "rc.h"
7 f08fdedc 2003-11-23 devnull #include "exec.h"
8 f08fdedc 2003-11-23 devnull #include "io.h"
9 f08fdedc 2003-11-23 devnull #include "fns.h"
10 f08fdedc 2003-11-23 devnull #include "getflags.h"
11 f08fdedc 2003-11-23 devnull char *Signame[]={
12 f08fdedc 2003-11-23 devnull "sigexit", "sighup", "sigint", "sigquit",
13 f08fdedc 2003-11-23 devnull "sigalrm", "sigkill", "sigfpe", "sigterm",
14 f08fdedc 2003-11-23 devnull 0
15 f08fdedc 2003-11-23 devnull };
16 f08fdedc 2003-11-23 devnull char *syssigname[]={
17 f08fdedc 2003-11-23 devnull "exit", /* can't happen */
18 f08fdedc 2003-11-23 devnull "hangup",
19 f08fdedc 2003-11-23 devnull "interrupt",
20 f08fdedc 2003-11-23 devnull "quit", /* can't happen */
21 f08fdedc 2003-11-23 devnull "alarm",
22 f08fdedc 2003-11-23 devnull "kill",
23 f08fdedc 2003-11-23 devnull "sys: fp: ",
24 f08fdedc 2003-11-23 devnull "term",
25 f08fdedc 2003-11-23 devnull 0
26 f08fdedc 2003-11-23 devnull };
27 f08fdedc 2003-11-23 devnull char*
28 f08fdedc 2003-11-23 devnull Rcmain(void)
29 f08fdedc 2003-11-23 devnull {
30 8ad51794 2004-03-25 devnull return unsharp("#9/rcmain");
31 f08fdedc 2003-11-23 devnull }
32 f08fdedc 2003-11-23 devnull
33 8ad51794 2004-03-25 devnull char Fdprefix[]="/dev/fd/";
34 edc77f0b 2007-03-25 devnull long readnb(int, char *, long);
35 f08fdedc 2003-11-23 devnull void execfinit(void);
36 f08fdedc 2003-11-23 devnull void execbind(void);
37 f08fdedc 2003-11-23 devnull void execmount(void);
38 39cff6e7 2004-10-17 devnull void execulimit(void);
39 39cff6e7 2004-10-17 devnull void execumask(void);
40 f7174317 2005-08-11 devnull void execrfork(void);
41 f08fdedc 2003-11-23 devnull builtin Builtin[]={
42 f08fdedc 2003-11-23 devnull "cd", execcd,
43 f08fdedc 2003-11-23 devnull "whatis", execwhatis,
44 f08fdedc 2003-11-23 devnull "eval", execeval,
45 f08fdedc 2003-11-23 devnull "exec", execexec, /* but with popword first */
46 f08fdedc 2003-11-23 devnull "exit", execexit,
47 f08fdedc 2003-11-23 devnull "shift", execshift,
48 f08fdedc 2003-11-23 devnull "wait", execwait,
49 f08fdedc 2003-11-23 devnull ".", execdot,
50 f08fdedc 2003-11-23 devnull "finit", execfinit,
51 f08fdedc 2003-11-23 devnull "flag", execflag,
52 39cff6e7 2004-10-17 devnull "ulimit", execulimit,
53 39cff6e7 2004-10-17 devnull "umask", execumask,
54 f7174317 2005-08-11 devnull "rfork", execrfork,
55 f08fdedc 2003-11-23 devnull 0
56 f08fdedc 2003-11-23 devnull };
57 f7174317 2005-08-11 devnull
58 f7174317 2005-08-11 devnull void
59 f7174317 2005-08-11 devnull execrfork(void)
60 f7174317 2005-08-11 devnull {
61 f7174317 2005-08-11 devnull int arg;
62 f7174317 2005-08-11 devnull char *s;
63 f7174317 2005-08-11 devnull
64 f7174317 2005-08-11 devnull switch(count(runq->argv->words)){
65 f7174317 2005-08-11 devnull case 1:
66 f7174317 2005-08-11 devnull arg = RFENVG|RFNOTEG|RFNAMEG;
67 f7174317 2005-08-11 devnull break;
68 f7174317 2005-08-11 devnull case 2:
69 f7174317 2005-08-11 devnull arg = 0;
70 f7174317 2005-08-11 devnull for(s = runq->argv->words->next->word;*s;s++) switch(*s){
71 f7174317 2005-08-11 devnull default:
72 f7174317 2005-08-11 devnull goto Usage;
73 f7174317 2005-08-11 devnull case 'n':
74 f7174317 2005-08-11 devnull arg|=RFNAMEG; break;
75 f7174317 2005-08-11 devnull case 'N':
76 f7174317 2005-08-11 devnull arg|=RFCNAMEG;
77 f7174317 2005-08-11 devnull break;
78 f7174317 2005-08-11 devnull case 'e':
79 f7174317 2005-08-11 devnull /* arg|=RFENVG; */ break;
80 f7174317 2005-08-11 devnull case 'E':
81 f7174317 2005-08-11 devnull arg|=RFCENVG; break;
82 f7174317 2005-08-11 devnull case 's':
83 f7174317 2005-08-11 devnull arg|=RFNOTEG; break;
84 f7174317 2005-08-11 devnull case 'f':
85 f7174317 2005-08-11 devnull arg|=RFFDG; break;
86 f7174317 2005-08-11 devnull case 'F':
87 f7174317 2005-08-11 devnull arg|=RFCFDG; break;
88 f7174317 2005-08-11 devnull }
89 f7174317 2005-08-11 devnull break;
90 f7174317 2005-08-11 devnull default:
91 f7174317 2005-08-11 devnull Usage:
92 f7174317 2005-08-11 devnull pfmt(err, "Usage: %s [nNeEsfF]\n", runq->argv->words->word);
93 f7174317 2005-08-11 devnull setstatus("rfork usage");
94 f7174317 2005-08-11 devnull poplist();
95 f7174317 2005-08-11 devnull return;
96 f7174317 2005-08-11 devnull }
97 f7174317 2005-08-11 devnull if(rfork(arg)==-1){
98 f7174317 2005-08-11 devnull pfmt(err, "rc: %s failed\n", runq->argv->words->word);
99 f7174317 2005-08-11 devnull setstatus("rfork failed");
100 f7174317 2005-08-11 devnull }
101 f7174317 2005-08-11 devnull else
102 f7174317 2005-08-11 devnull setstatus("");
103 f7174317 2005-08-11 devnull poplist();
104 f7174317 2005-08-11 devnull }
105 f7174317 2005-08-11 devnull
106 f7174317 2005-08-11 devnull
107 f7174317 2005-08-11 devnull
108 f08fdedc 2003-11-23 devnull #define SEP '\1'
109 f08fdedc 2003-11-23 devnull char **environp;
110 f08fdedc 2003-11-23 devnull struct word *enval(s)
111 f08fdedc 2003-11-23 devnull register char *s;
112 f08fdedc 2003-11-23 devnull {
113 f08fdedc 2003-11-23 devnull register char *t, c;
114 f08fdedc 2003-11-23 devnull register struct word *v;
115 f08fdedc 2003-11-23 devnull for(t=s;*t && *t!=SEP;t++);
116 f08fdedc 2003-11-23 devnull c=*t;
117 f08fdedc 2003-11-23 devnull *t='\0';
118 f08fdedc 2003-11-23 devnull v=newword(s, c=='\0'?(struct word *)0:enval(t+1));
119 f08fdedc 2003-11-23 devnull *t=c;
120 f08fdedc 2003-11-23 devnull return v;
121 f08fdedc 2003-11-23 devnull }
122 f08fdedc 2003-11-23 devnull void Vinit(void){
123 f08fdedc 2003-11-23 devnull extern char **environ;
124 f08fdedc 2003-11-23 devnull register char *s;
125 f08fdedc 2003-11-23 devnull register char **env=environ;
126 f08fdedc 2003-11-23 devnull environp=env;
127 f08fdedc 2003-11-23 devnull for(;*env;env++){
128 f08fdedc 2003-11-23 devnull for(s=*env;*s && *s!='(' && *s!='=';s++);
129 f08fdedc 2003-11-23 devnull switch(*s){
130 f08fdedc 2003-11-23 devnull case '\0':
131 cbeb0b26 2006-04-01 devnull /* pfmt(err, "rc: odd environment %q?\n", *env); */
132 f08fdedc 2003-11-23 devnull break;
133 f08fdedc 2003-11-23 devnull case '=':
134 f08fdedc 2003-11-23 devnull *s='\0';
135 f08fdedc 2003-11-23 devnull setvar(*env, enval(s+1));
136 f08fdedc 2003-11-23 devnull *s='=';
137 f08fdedc 2003-11-23 devnull break;
138 f08fdedc 2003-11-23 devnull case '(': /* ignore functions for now */
139 f08fdedc 2003-11-23 devnull break;
140 f08fdedc 2003-11-23 devnull }
141 f08fdedc 2003-11-23 devnull }
142 f08fdedc 2003-11-23 devnull }
143 f08fdedc 2003-11-23 devnull char **envp;
144 f08fdedc 2003-11-23 devnull void Xrdfn(void){
145 f08fdedc 2003-11-23 devnull char *p;
146 f08fdedc 2003-11-23 devnull register char *s;
147 f08fdedc 2003-11-23 devnull register int len;
148 f08fdedc 2003-11-23 devnull for(;*envp;envp++){
149 f08fdedc 2003-11-23 devnull s = *envp;
150 f08fdedc 2003-11-23 devnull if(strncmp(s, "fn#", 3) == 0){
151 f08fdedc 2003-11-23 devnull p = strchr(s, '=');
152 f08fdedc 2003-11-23 devnull if(p == nil)
153 f08fdedc 2003-11-23 devnull continue;
154 f08fdedc 2003-11-23 devnull *p = ' ';
155 f08fdedc 2003-11-23 devnull s[2] = ' ';
156 f08fdedc 2003-11-23 devnull len = strlen(s);
157 f08fdedc 2003-11-23 devnull execcmds(opencore(s, len));
158 f08fdedc 2003-11-23 devnull s[len] = '\0';
159 f08fdedc 2003-11-23 devnull return;
160 f08fdedc 2003-11-23 devnull }
161 f08fdedc 2003-11-23 devnull #if 0
162 f08fdedc 2003-11-23 devnull for(s=*envp;*s && *s!='(' && *s!='=';s++);
163 f08fdedc 2003-11-23 devnull switch(*s){
164 f08fdedc 2003-11-23 devnull case '\0':
165 f08fdedc 2003-11-23 devnull pfmt(err, "environment %q?\n", *envp);
166 f08fdedc 2003-11-23 devnull break;
167 f08fdedc 2003-11-23 devnull case '=': /* ignore variables */
168 f08fdedc 2003-11-23 devnull break;
169 f08fdedc 2003-11-23 devnull case '(': /* Bourne again */
170 f08fdedc 2003-11-23 devnull s=*envp+3;
171 f08fdedc 2003-11-23 devnull envp++;
172 f08fdedc 2003-11-23 devnull len=strlen(s);
173 f08fdedc 2003-11-23 devnull s[len]='\n';
174 f08fdedc 2003-11-23 devnull execcmds(opencore(s, len+1));
175 f08fdedc 2003-11-23 devnull s[len]='\0';
176 f08fdedc 2003-11-23 devnull return;
177 f08fdedc 2003-11-23 devnull }
178 f08fdedc 2003-11-23 devnull #endif
179 f08fdedc 2003-11-23 devnull }
180 f08fdedc 2003-11-23 devnull Xreturn();
181 f08fdedc 2003-11-23 devnull }
182 f08fdedc 2003-11-23 devnull union code rdfns[4];
183 f08fdedc 2003-11-23 devnull void execfinit(void){
184 f08fdedc 2003-11-23 devnull static int first=1;
185 f08fdedc 2003-11-23 devnull if(first){
186 f08fdedc 2003-11-23 devnull rdfns[0].i=1;
187 f08fdedc 2003-11-23 devnull rdfns[1].f=Xrdfn;
188 f08fdedc 2003-11-23 devnull rdfns[2].f=Xjump;
189 f08fdedc 2003-11-23 devnull rdfns[3].i=1;
190 f08fdedc 2003-11-23 devnull first=0;
191 f08fdedc 2003-11-23 devnull }
192 f08fdedc 2003-11-23 devnull Xpopm();
193 f08fdedc 2003-11-23 devnull envp=environp;
194 f08fdedc 2003-11-23 devnull start(rdfns, 1, runq->local);
195 f08fdedc 2003-11-23 devnull }
196 f002cc17 2004-10-17 devnull extern int mapfd(int);
197 f08fdedc 2003-11-23 devnull int Waitfor(int pid, int unused0){
198 f08fdedc 2003-11-23 devnull thread *p;
199 f08fdedc 2003-11-23 devnull Waitmsg *w;
200 f08fdedc 2003-11-23 devnull char errbuf[ERRMAX];
201 f08fdedc 2003-11-23 devnull
202 4b241872 2007-03-26 devnull if(pid >= 0 && !havewaitpid(pid))
203 4b241872 2007-03-26 devnull return 0;
204 f08fdedc 2003-11-23 devnull while((w = wait()) != nil){
205 4b241872 2007-03-26 devnull delwaitpid(w->pid);
206 f08fdedc 2003-11-23 devnull if(w->pid==pid){
207 f002cc17 2004-10-17 devnull if(strncmp(w->msg, "signal: ", 8) == 0)
208 f002cc17 2004-10-17 devnull fprint(mapfd(2), "%d: %s\n", w->pid, w->msg);
209 f08fdedc 2003-11-23 devnull setstatus(w->msg);
210 f08fdedc 2003-11-23 devnull free(w);
211 f08fdedc 2003-11-23 devnull return 0;
212 f08fdedc 2003-11-23 devnull }
213 7236e45b 2006-02-14 devnull if(runq->iflag && strncmp(w->msg, "signal: ", 8) == 0)
214 f002cc17 2004-10-17 devnull fprint(2, "%d: %s\n", w->pid, w->msg);
215 f08fdedc 2003-11-23 devnull for(p=runq->ret;p;p=p->ret)
216 f08fdedc 2003-11-23 devnull if(p->pid==w->pid){
217 f08fdedc 2003-11-23 devnull p->pid=-1;
218 f08fdedc 2003-11-23 devnull strcpy(p->status, w->msg);
219 f08fdedc 2003-11-23 devnull }
220 f08fdedc 2003-11-23 devnull free(w);
221 f08fdedc 2003-11-23 devnull }
222 f08fdedc 2003-11-23 devnull
223 4b241872 2007-03-26 devnull rerrstr(errbuf, sizeof errbuf);
224 f08fdedc 2003-11-23 devnull if(strcmp(errbuf, "interrupted")==0) return -1;
225 f08fdedc 2003-11-23 devnull return 0;
226 f08fdedc 2003-11-23 devnull }
227 f08fdedc 2003-11-23 devnull char **mkargv(word *a)
228 f08fdedc 2003-11-23 devnull {
229 f08fdedc 2003-11-23 devnull char **argv=(char **)emalloc((count(a)+2)*sizeof(char *));
230 f08fdedc 2003-11-23 devnull char **argp=argv+1; /* leave one at front for runcoms */
231 f08fdedc 2003-11-23 devnull for(;a;a=a->next) *argp++=a->word;
232 f08fdedc 2003-11-23 devnull *argp=0;
233 f08fdedc 2003-11-23 devnull return argv;
234 f08fdedc 2003-11-23 devnull }
235 f08fdedc 2003-11-23 devnull /*
236 f08fdedc 2003-11-23 devnull void addenv(var *v)
237 f08fdedc 2003-11-23 devnull {
238 f08fdedc 2003-11-23 devnull char envname[256];
239 f08fdedc 2003-11-23 devnull word *w;
240 f08fdedc 2003-11-23 devnull int f;
241 f08fdedc 2003-11-23 devnull io *fd;
242 f08fdedc 2003-11-23 devnull if(v->changed){
243 f08fdedc 2003-11-23 devnull v->changed=0;
244 f08fdedc 2003-11-23 devnull snprint(envname, sizeof envname, "/env/%s", v->name);
245 f08fdedc 2003-11-23 devnull if((f=Creat(envname))<0)
246 f08fdedc 2003-11-23 devnull pfmt(err, "rc: can't open %s: %r\n", envname);
247 f08fdedc 2003-11-23 devnull else{
248 f08fdedc 2003-11-23 devnull for(w=v->val;w;w=w->next)
249 f08fdedc 2003-11-23 devnull write(f, w->word, strlen(w->word)+1L);
250 f08fdedc 2003-11-23 devnull close(f);
251 f08fdedc 2003-11-23 devnull }
252 f08fdedc 2003-11-23 devnull }
253 f08fdedc 2003-11-23 devnull if(v->fnchanged){
254 f08fdedc 2003-11-23 devnull v->fnchanged=0;
255 f08fdedc 2003-11-23 devnull snprint(envname, sizeof envname, "/env/fn#%s", v->name);
256 f08fdedc 2003-11-23 devnull if((f=Creat(envname))<0)
257 f08fdedc 2003-11-23 devnull pfmt(err, "rc: can't open %s: %r\n", envname);
258 f08fdedc 2003-11-23 devnull else{
259 f08fdedc 2003-11-23 devnull if(v->fn){
260 f08fdedc 2003-11-23 devnull fd=openfd(f);
261 f08fdedc 2003-11-23 devnull pfmt(fd, "fn %s %s\n", v->name, v->fn[v->pc-1].s);
262 f08fdedc 2003-11-23 devnull closeio(fd);
263 f08fdedc 2003-11-23 devnull }
264 f08fdedc 2003-11-23 devnull close(f);
265 f08fdedc 2003-11-23 devnull }
266 f08fdedc 2003-11-23 devnull }
267 f08fdedc 2003-11-23 devnull }
268 f08fdedc 2003-11-23 devnull void updenvlocal(var *v)
269 f08fdedc 2003-11-23 devnull {
270 f08fdedc 2003-11-23 devnull if(v){
271 f08fdedc 2003-11-23 devnull updenvlocal(v->next);
272 f08fdedc 2003-11-23 devnull addenv(v);
273 f08fdedc 2003-11-23 devnull }
274 f08fdedc 2003-11-23 devnull }
275 f08fdedc 2003-11-23 devnull void Updenv(void){
276 f08fdedc 2003-11-23 devnull var *v, **h;
277 f08fdedc 2003-11-23 devnull for(h=gvar;h!=&gvar[NVAR];h++)
278 f08fdedc 2003-11-23 devnull for(v=*h;v;v=v->next)
279 f08fdedc 2003-11-23 devnull addenv(v);
280 f08fdedc 2003-11-23 devnull if(runq) updenvlocal(runq->local);
281 f08fdedc 2003-11-23 devnull }
282 f08fdedc 2003-11-23 devnull */
283 f08fdedc 2003-11-23 devnull int
284 be22ae2d 2004-03-26 devnull cmpenv(const void *a, const void *b)
285 f08fdedc 2003-11-23 devnull {
286 be22ae2d 2004-03-26 devnull return strcmp(*(char**)a, *(char**)b);
287 f08fdedc 2003-11-23 devnull }
288 f08fdedc 2003-11-23 devnull char **mkenv(){
289 f08fdedc 2003-11-23 devnull register char **env, **ep, *p, *q;
290 f08fdedc 2003-11-23 devnull register struct var **h, *v;
291 f08fdedc 2003-11-23 devnull register struct word *a;
292 f08fdedc 2003-11-23 devnull register int nvar=0, nchr=0, sep;
293 f08fdedc 2003-11-23 devnull /*
294 f08fdedc 2003-11-23 devnull * Slightly kludgy loops look at locals then globals
295 f08fdedc 2003-11-23 devnull */
296 f08fdedc 2003-11-23 devnull for(h=gvar-1;h!=&gvar[NVAR];h++) for(v=h>=gvar?*h:runq->local;v;v=v->next){
297 f08fdedc 2003-11-23 devnull if((v==vlook(v->name)) && v->val){
298 f08fdedc 2003-11-23 devnull nvar++;
299 f08fdedc 2003-11-23 devnull nchr+=strlen(v->name)+1;
300 f08fdedc 2003-11-23 devnull for(a=v->val;a;a=a->next)
301 f08fdedc 2003-11-23 devnull nchr+=strlen(a->word)+1;
302 f08fdedc 2003-11-23 devnull }
303 f08fdedc 2003-11-23 devnull if(v->fn){
304 f08fdedc 2003-11-23 devnull nvar++;
305 f08fdedc 2003-11-23 devnull nchr+=strlen(v->name)+strlen(v->fn[v->pc-1].s)+8;
306 f08fdedc 2003-11-23 devnull }
307 f08fdedc 2003-11-23 devnull }
308 f08fdedc 2003-11-23 devnull env=(char **)emalloc((nvar+1)*sizeof(char *)+nchr);
309 f08fdedc 2003-11-23 devnull ep=env;
310 f08fdedc 2003-11-23 devnull p=(char *)&env[nvar+1];
311 f08fdedc 2003-11-23 devnull for(h=gvar-1;h!=&gvar[NVAR];h++) for(v=h>=gvar?*h:runq->local;v;v=v->next){
312 f08fdedc 2003-11-23 devnull if((v==vlook(v->name)) && v->val){
313 f08fdedc 2003-11-23 devnull *ep++=p;
314 f08fdedc 2003-11-23 devnull q=v->name;
315 f08fdedc 2003-11-23 devnull while(*q) *p++=*q++;
316 f08fdedc 2003-11-23 devnull sep='=';
317 f08fdedc 2003-11-23 devnull for(a=v->val;a;a=a->next){
318 f08fdedc 2003-11-23 devnull *p++=sep;
319 f08fdedc 2003-11-23 devnull sep=SEP;
320 f08fdedc 2003-11-23 devnull q=a->word;
321 f08fdedc 2003-11-23 devnull while(*q) *p++=*q++;
322 f08fdedc 2003-11-23 devnull }
323 f08fdedc 2003-11-23 devnull *p++='\0';
324 f08fdedc 2003-11-23 devnull }
325 f08fdedc 2003-11-23 devnull if(v->fn){
326 f08fdedc 2003-11-23 devnull *ep++=p;
327 f08fdedc 2003-11-23 devnull #if 0
328 f08fdedc 2003-11-23 devnull *p++='#'; *p++='('; *p++=')'; /* to fool Bourne */
329 f08fdedc 2003-11-23 devnull *p++='f'; *p++='n'; *p++=' ';
330 f08fdedc 2003-11-23 devnull q=v->name;
331 f08fdedc 2003-11-23 devnull while(*q) *p++=*q++;
332 f08fdedc 2003-11-23 devnull *p++=' ';
333 f08fdedc 2003-11-23 devnull #endif
334 f08fdedc 2003-11-23 devnull *p++='f'; *p++='n'; *p++='#';
335 f08fdedc 2003-11-23 devnull q=v->name;
336 f08fdedc 2003-11-23 devnull while(*q) *p++=*q++;
337 f08fdedc 2003-11-23 devnull *p++='=';
338 f08fdedc 2003-11-23 devnull q=v->fn[v->pc-1].s;
339 f08fdedc 2003-11-23 devnull while(*q) *p++=*q++;
340 f08fdedc 2003-11-23 devnull *p++='\n';
341 f08fdedc 2003-11-23 devnull *p++='\0';
342 f08fdedc 2003-11-23 devnull }
343 f08fdedc 2003-11-23 devnull }
344 f08fdedc 2003-11-23 devnull *ep=0;
345 f08fdedc 2003-11-23 devnull qsort((char *)env, nvar, sizeof ep[0], cmpenv);
346 fa325e9b 2020-01-10 cross return env;
347 f08fdedc 2003-11-23 devnull }
348 f08fdedc 2003-11-23 devnull void Updenv(void){}
349 f08fdedc 2003-11-23 devnull void Execute(word *args, word *path)
350 f08fdedc 2003-11-23 devnull {
351 f08fdedc 2003-11-23 devnull char **argv=mkargv(args);
352 f08fdedc 2003-11-23 devnull char **env=mkenv();
353 f08fdedc 2003-11-23 devnull char file[1024];
354 f08fdedc 2003-11-23 devnull int nc;
355 f08fdedc 2003-11-23 devnull Updenv();
356 f08fdedc 2003-11-23 devnull for(;path;path=path->next){
357 f08fdedc 2003-11-23 devnull nc=strlen(path->word);
358 f08fdedc 2003-11-23 devnull if(nc<1024){
359 f08fdedc 2003-11-23 devnull strcpy(file, path->word);
360 f08fdedc 2003-11-23 devnull if(file[0]){
361 f08fdedc 2003-11-23 devnull strcat(file, "/");
362 f08fdedc 2003-11-23 devnull nc++;
363 f08fdedc 2003-11-23 devnull }
364 f08fdedc 2003-11-23 devnull if(nc+strlen(argv[1])<1024){
365 f08fdedc 2003-11-23 devnull strcat(file, argv[1]);
366 f08fdedc 2003-11-23 devnull execve(file, argv+1, env);
367 f08fdedc 2003-11-23 devnull }
368 f08fdedc 2003-11-23 devnull else werrstr("command name too long");
369 f08fdedc 2003-11-23 devnull }
370 f08fdedc 2003-11-23 devnull }
371 f08fdedc 2003-11-23 devnull rerrstr(file, sizeof file);
372 f08fdedc 2003-11-23 devnull pfmt(err, "%s: %s\n", argv[1], file);
373 f08fdedc 2003-11-23 devnull efree((char *)argv);
374 f08fdedc 2003-11-23 devnull }
375 f08fdedc 2003-11-23 devnull #define NDIR 256 /* shoud be a better way */
376 f08fdedc 2003-11-23 devnull int Globsize(char *p)
377 f08fdedc 2003-11-23 devnull {
378 f08fdedc 2003-11-23 devnull ulong isglob=0, globlen=NDIR+1;
379 f08fdedc 2003-11-23 devnull for(;*p;p++){
380 f08fdedc 2003-11-23 devnull if(*p==GLOB){
381 f08fdedc 2003-11-23 devnull p++;
382 f08fdedc 2003-11-23 devnull if(*p!=GLOB) isglob++;
383 f08fdedc 2003-11-23 devnull globlen+=*p=='*'?NDIR:1;
384 f08fdedc 2003-11-23 devnull }
385 f08fdedc 2003-11-23 devnull else
386 f08fdedc 2003-11-23 devnull globlen++;
387 f08fdedc 2003-11-23 devnull }
388 f08fdedc 2003-11-23 devnull return isglob?globlen:0;
389 f08fdedc 2003-11-23 devnull }
390 f08fdedc 2003-11-23 devnull #define NFD 50
391 f08fdedc 2003-11-23 devnull #define NDBUF 32
392 f08fdedc 2003-11-23 devnull struct{
393 f08fdedc 2003-11-23 devnull Dir *dbuf;
394 f08fdedc 2003-11-23 devnull int i;
395 f08fdedc 2003-11-23 devnull int n;
396 f08fdedc 2003-11-23 devnull }dir[NFD];
397 f08fdedc 2003-11-23 devnull int Opendir(char *name)
398 f08fdedc 2003-11-23 devnull {
399 f08fdedc 2003-11-23 devnull Dir *db;
400 f08fdedc 2003-11-23 devnull int f;
401 f08fdedc 2003-11-23 devnull f=open(name, 0);
402 f08fdedc 2003-11-23 devnull if(f==-1)
403 f08fdedc 2003-11-23 devnull return f;
404 f08fdedc 2003-11-23 devnull db = dirfstat(f);
405 f08fdedc 2003-11-23 devnull if(db!=nil && (db->mode&DMDIR)){
406 f08fdedc 2003-11-23 devnull if(f<NFD){
407 f08fdedc 2003-11-23 devnull dir[f].i=0;
408 f08fdedc 2003-11-23 devnull dir[f].n=0;
409 f08fdedc 2003-11-23 devnull }
410 f08fdedc 2003-11-23 devnull free(db);
411 f08fdedc 2003-11-23 devnull return f;
412 f08fdedc 2003-11-23 devnull }
413 f08fdedc 2003-11-23 devnull free(db);
414 f08fdedc 2003-11-23 devnull close(f);
415 f08fdedc 2003-11-23 devnull return -1;
416 f08fdedc 2003-11-23 devnull }
417 c8f53842 2007-03-26 devnull int Readdir(int f, char *p, int onlydirs)
418 f08fdedc 2003-11-23 devnull {
419 f08fdedc 2003-11-23 devnull int n;
420 c8f53842 2007-03-26 devnull USED(onlydirs); /* only advisory */
421 c8f53842 2007-03-26 devnull
422 f08fdedc 2003-11-23 devnull if(f<0 || f>=NFD)
423 f08fdedc 2003-11-23 devnull return 0;
424 f08fdedc 2003-11-23 devnull if(dir[f].i==dir[f].n){ /* read */
425 f08fdedc 2003-11-23 devnull free(dir[f].dbuf);
426 f08fdedc 2003-11-23 devnull dir[f].dbuf=0;
427 f08fdedc 2003-11-23 devnull n=dirread(f, &dir[f].dbuf);
428 f08fdedc 2003-11-23 devnull if(n>=0)
429 f08fdedc 2003-11-23 devnull dir[f].n=n;
430 f08fdedc 2003-11-23 devnull else
431 f08fdedc 2003-11-23 devnull dir[f].n=0;
432 f08fdedc 2003-11-23 devnull dir[f].i=0;
433 f08fdedc 2003-11-23 devnull }
434 f08fdedc 2003-11-23 devnull if(dir[f].i==dir[f].n)
435 f08fdedc 2003-11-23 devnull return 0;
436 f08fdedc 2003-11-23 devnull strcpy(p, dir[f].dbuf[dir[f].i].name);
437 f08fdedc 2003-11-23 devnull dir[f].i++;
438 f08fdedc 2003-11-23 devnull return 1;
439 f08fdedc 2003-11-23 devnull }
440 f08fdedc 2003-11-23 devnull void Closedir(int f){
441 f08fdedc 2003-11-23 devnull if(f>=0 && f<NFD){
442 f08fdedc 2003-11-23 devnull free(dir[f].dbuf);
443 f08fdedc 2003-11-23 devnull dir[f].i=0;
444 f08fdedc 2003-11-23 devnull dir[f].n=0;
445 f08fdedc 2003-11-23 devnull dir[f].dbuf=0;
446 f08fdedc 2003-11-23 devnull }
447 f08fdedc 2003-11-23 devnull close(f);
448 f08fdedc 2003-11-23 devnull }
449 f08fdedc 2003-11-23 devnull int interrupted = 0;
450 f08fdedc 2003-11-23 devnull void
451 f08fdedc 2003-11-23 devnull notifyf(void *unused0, char *s)
452 f08fdedc 2003-11-23 devnull {
453 f08fdedc 2003-11-23 devnull int i;
454 669250d1 2003-12-03 devnull for(i=0;syssigname[i];i++)
455 669250d1 2003-12-03 devnull if(strncmp(s, syssigname[i], strlen(syssigname[i]))==0){
456 69ab5d3d 2004-03-26 devnull if(strncmp(s, "sys: ", 5)!=0){
457 69ab5d3d 2004-03-26 devnull if(kidpid && !interrupted){
458 69ab5d3d 2004-03-26 devnull interrupted=1;
459 69ab5d3d 2004-03-26 devnull postnote(PNGROUP, kidpid, s);
460 69ab5d3d 2004-03-26 devnull }
461 69ab5d3d 2004-03-26 devnull interrupted = 1;
462 69ab5d3d 2004-03-26 devnull }
463 669250d1 2003-12-03 devnull goto Out;
464 669250d1 2003-12-03 devnull }
465 c6f92061 2005-07-14 devnull if(strcmp(s, "sys: window size change") != 0)
466 4ee543e5 2005-03-18 devnull if(strcmp(s, "sys: write on closed pipe") != 0)
467 0b917997 2004-03-04 devnull if(strcmp(s, "sys: child") != 0)
468 0b917997 2004-03-04 devnull pfmt(err, "rc: note: %s\n", s);
469 f08fdedc 2003-11-23 devnull noted(NDFLT);
470 f08fdedc 2003-11-23 devnull return;
471 f08fdedc 2003-11-23 devnull Out:
472 f08fdedc 2003-11-23 devnull if(strcmp(s, "interrupt")!=0 || trap[i]==0){
473 f08fdedc 2003-11-23 devnull trap[i]++;
474 f08fdedc 2003-11-23 devnull ntrap++;
475 f08fdedc 2003-11-23 devnull }
476 f08fdedc 2003-11-23 devnull if(ntrap>=32){ /* rc is probably in a trap loop */
477 f08fdedc 2003-11-23 devnull pfmt(err, "rc: Too many traps (trap %s), aborting\n", s);
478 f08fdedc 2003-11-23 devnull abort();
479 f08fdedc 2003-11-23 devnull }
480 f08fdedc 2003-11-23 devnull noted(NCONT);
481 f08fdedc 2003-11-23 devnull }
482 f08fdedc 2003-11-23 devnull void Trapinit(void){
483 f08fdedc 2003-11-23 devnull notify(notifyf);
484 f08fdedc 2003-11-23 devnull }
485 f08fdedc 2003-11-23 devnull void Unlink(char *name)
486 f08fdedc 2003-11-23 devnull {
487 f08fdedc 2003-11-23 devnull remove(name);
488 f08fdedc 2003-11-23 devnull }
489 f08fdedc 2003-11-23 devnull long Write(int fd, char *buf, long cnt)
490 f08fdedc 2003-11-23 devnull {
491 f08fdedc 2003-11-23 devnull return write(fd, buf, (long)cnt);
492 f08fdedc 2003-11-23 devnull }
493 f08fdedc 2003-11-23 devnull long Read(int fd, char *buf, long cnt)
494 f08fdedc 2003-11-23 devnull {
495 669250d1 2003-12-03 devnull int i;
496 669250d1 2003-12-03 devnull
497 edc77f0b 2007-03-25 devnull i = readnb(fd, buf, cnt);
498 669250d1 2003-12-03 devnull if(ntrap) dotrap();
499 669250d1 2003-12-03 devnull return i;
500 f08fdedc 2003-11-23 devnull }
501 f08fdedc 2003-11-23 devnull long Seek(int fd, long cnt, long whence)
502 f08fdedc 2003-11-23 devnull {
503 f08fdedc 2003-11-23 devnull return seek(fd, cnt, whence);
504 f08fdedc 2003-11-23 devnull }
505 f08fdedc 2003-11-23 devnull int Executable(char *file)
506 f08fdedc 2003-11-23 devnull {
507 f08fdedc 2003-11-23 devnull Dir *statbuf;
508 f08fdedc 2003-11-23 devnull int ret;
509 f08fdedc 2003-11-23 devnull
510 f08fdedc 2003-11-23 devnull statbuf = dirstat(file);
511 f08fdedc 2003-11-23 devnull if(statbuf == nil) return 0;
512 f08fdedc 2003-11-23 devnull ret = ((statbuf->mode&0111)!=0 && (statbuf->mode&DMDIR)==0);
513 f08fdedc 2003-11-23 devnull free(statbuf);
514 f08fdedc 2003-11-23 devnull return ret;
515 f08fdedc 2003-11-23 devnull }
516 f08fdedc 2003-11-23 devnull int Creat(char *file)
517 f08fdedc 2003-11-23 devnull {
518 f08fdedc 2003-11-23 devnull return create(file, 1, 0666L);
519 f08fdedc 2003-11-23 devnull }
520 f08fdedc 2003-11-23 devnull int Dup(int a, int b){
521 f08fdedc 2003-11-23 devnull return dup(a, b);
522 f08fdedc 2003-11-23 devnull }
523 134c20c6 2005-02-13 devnull int Dup1(int a){
524 134c20c6 2005-02-13 devnull return dup(a, -1);
525 f08fdedc 2003-11-23 devnull }
526 f08fdedc 2003-11-23 devnull void Exit(char *stat)
527 f08fdedc 2003-11-23 devnull {
528 f08fdedc 2003-11-23 devnull Updenv();
529 f08fdedc 2003-11-23 devnull setstatus(stat);
530 f08fdedc 2003-11-23 devnull exits(truestatus()?"":getstatus());
531 f08fdedc 2003-11-23 devnull }
532 f08fdedc 2003-11-23 devnull int Eintr(void){
533 f08fdedc 2003-11-23 devnull return interrupted;
534 f08fdedc 2003-11-23 devnull }
535 f08fdedc 2003-11-23 devnull void Noerror(void){
536 f08fdedc 2003-11-23 devnull interrupted=0;
537 f08fdedc 2003-11-23 devnull }
538 f08fdedc 2003-11-23 devnull int
539 be22ae2d 2004-03-26 devnull Isatty(int fd){
540 f08fdedc 2003-11-23 devnull return isatty(fd);
541 f08fdedc 2003-11-23 devnull }
542 f08fdedc 2003-11-23 devnull void Abort(void){
543 f08fdedc 2003-11-23 devnull pfmt(err, "aborting\n");
544 f08fdedc 2003-11-23 devnull flush(err);
545 f08fdedc 2003-11-23 devnull Exit("aborting");
546 f08fdedc 2003-11-23 devnull }
547 f08fdedc 2003-11-23 devnull void Memcpy(char *a, char *b, long n)
548 f08fdedc 2003-11-23 devnull {
549 f08fdedc 2003-11-23 devnull memmove(a, b, (long)n);
550 f08fdedc 2003-11-23 devnull }
551 f08fdedc 2003-11-23 devnull void *Malloc(ulong n){
552 f08fdedc 2003-11-23 devnull return malloc(n);
553 f08fdedc 2003-11-23 devnull }
554 1f2ab849 2006-04-08 devnull
555 1f2ab849 2006-04-08 devnull int
556 1f2ab849 2006-04-08 devnull exitcode(char *msg)
557 1f2ab849 2006-04-08 devnull {
558 1f2ab849 2006-04-08 devnull int n;
559 fa325e9b 2020-01-10 cross
560 1f2ab849 2006-04-08 devnull n = atoi(msg);
561 1f2ab849 2006-04-08 devnull if(n == 0)
562 1f2ab849 2006-04-08 devnull n = 1;
563 1f2ab849 2006-04-08 devnull return n;
564 4b241872 2007-03-26 devnull }
565 4b241872 2007-03-26 devnull
566 4b241872 2007-03-26 devnull int *waitpids;
567 4b241872 2007-03-26 devnull int nwaitpids;
568 4b241872 2007-03-26 devnull
569 4b241872 2007-03-26 devnull void
570 4b241872 2007-03-26 devnull addwaitpid(int pid)
571 4b241872 2007-03-26 devnull {
572 4b241872 2007-03-26 devnull waitpids = realloc(waitpids, (nwaitpids+1)*sizeof waitpids[0]);
573 4b241872 2007-03-26 devnull if(waitpids == 0)
574 4b241872 2007-03-26 devnull panic("Can't realloc %d waitpids", nwaitpids+1);
575 4b241872 2007-03-26 devnull waitpids[nwaitpids++] = pid;
576 1f2ab849 2006-04-08 devnull }
577 4b241872 2007-03-26 devnull
578 4b241872 2007-03-26 devnull void
579 4b241872 2007-03-26 devnull delwaitpid(int pid)
580 4b241872 2007-03-26 devnull {
581 4b241872 2007-03-26 devnull int r, w;
582 fa325e9b 2020-01-10 cross
583 4b241872 2007-03-26 devnull for(r=w=0; r<nwaitpids; r++)
584 4b241872 2007-03-26 devnull if(waitpids[r] != pid)
585 4b241872 2007-03-26 devnull waitpids[w++] = waitpids[r];
586 4b241872 2007-03-26 devnull nwaitpids = w;
587 4b241872 2007-03-26 devnull }
588 4b241872 2007-03-26 devnull
589 4b241872 2007-03-26 devnull void
590 4b241872 2007-03-26 devnull clearwaitpids(void)
591 4b241872 2007-03-26 devnull {
592 4b241872 2007-03-26 devnull nwaitpids = 0;
593 4b241872 2007-03-26 devnull }
594 4b241872 2007-03-26 devnull
595 4b241872 2007-03-26 devnull int
596 4b241872 2007-03-26 devnull havewaitpid(int pid)
597 4b241872 2007-03-26 devnull {
598 4b241872 2007-03-26 devnull int i;
599 fa325e9b 2020-01-10 cross
600 4b241872 2007-03-26 devnull for(i=0; i<nwaitpids; i++)
601 4b241872 2007-03-26 devnull if(waitpids[i] == pid)
602 4b241872 2007-03-26 devnull return 1;
603 4b241872 2007-03-26 devnull return 0;
604 4b241872 2007-03-26 devnull }