Blame


1 564ca709 2004-04-19 devnull #include <u.h>
2 564ca709 2004-04-19 devnull #include <libc.h>
3 564ca709 2004-04-19 devnull #include <bio.h>
4 564ca709 2004-04-19 devnull #include <mach.h>
5 564ca709 2004-04-19 devnull #define Extern
6 564ca709 2004-04-19 devnull #include "acid.h"
7 564ca709 2004-04-19 devnull #include "y.tab.h"
8 564ca709 2004-04-19 devnull
9 564ca709 2004-04-19 devnull extern int __ifmt(Fmt*);
10 564ca709 2004-04-19 devnull
11 564ca709 2004-04-19 devnull static Biobuf bioout;
12 564ca709 2004-04-19 devnull static char* lm[16];
13 564ca709 2004-04-19 devnull static int nlm;
14 564ca709 2004-04-19 devnull static char* mtype;
15 564ca709 2004-04-19 devnull
16 564ca709 2004-04-19 devnull static int attachfiles(int, char**);
17 564ca709 2004-04-19 devnull int xfmt(Fmt*);
18 564ca709 2004-04-19 devnull int isnumeric(char*);
19 564ca709 2004-04-19 devnull void die(void);
20 564ca709 2004-04-19 devnull void setcore(Fhdr*);
21 564ca709 2004-04-19 devnull
22 564ca709 2004-04-19 devnull void
23 564ca709 2004-04-19 devnull usage(void)
24 564ca709 2004-04-19 devnull {
25 564ca709 2004-04-19 devnull fprint(2, "usage: acid [-c core] [-l module] [-m machine] [-qrw] [-k] [pid] [file]\n");
26 564ca709 2004-04-19 devnull exits("usage");
27 564ca709 2004-04-19 devnull }
28 564ca709 2004-04-19 devnull
29 564ca709 2004-04-19 devnull void
30 564ca709 2004-04-19 devnull main(int argc, char *argv[])
31 564ca709 2004-04-19 devnull {
32 564ca709 2004-04-19 devnull Lsym *l;
33 564ca709 2004-04-19 devnull Node *n;
34 564ca709 2004-04-19 devnull char buf[128], *s;
35 564ca709 2004-04-19 devnull int pid, i;
36 564ca709 2004-04-19 devnull
37 564ca709 2004-04-19 devnull argv0 = argv[0];
38 564ca709 2004-04-19 devnull pid = 0;
39 564ca709 2004-04-19 devnull quiet = 1;
40 564ca709 2004-04-19 devnull
41 564ca709 2004-04-19 devnull mtype = 0;
42 564ca709 2004-04-19 devnull ARGBEGIN{
43 564ca709 2004-04-19 devnull case 'A':
44 564ca709 2004-04-19 devnull abort();
45 564ca709 2004-04-19 devnull break;
46 564ca709 2004-04-19 devnull case 'm':
47 564ca709 2004-04-19 devnull mtype = ARGF();
48 564ca709 2004-04-19 devnull break;
49 564ca709 2004-04-19 devnull case 'w':
50 564ca709 2004-04-19 devnull wtflag = 1;
51 564ca709 2004-04-19 devnull break;
52 564ca709 2004-04-19 devnull case 'l':
53 564ca709 2004-04-19 devnull s = ARGF();
54 564ca709 2004-04-19 devnull if(s == 0)
55 564ca709 2004-04-19 devnull usage();
56 564ca709 2004-04-19 devnull lm[nlm++] = s;
57 564ca709 2004-04-19 devnull break;
58 564ca709 2004-04-19 devnull case 'k':
59 564ca709 2004-04-19 devnull kernel++;
60 564ca709 2004-04-19 devnull break;
61 564ca709 2004-04-19 devnull case 'q':
62 564ca709 2004-04-19 devnull quiet = 0;
63 564ca709 2004-04-19 devnull break;
64 564ca709 2004-04-19 devnull case 'r':
65 564ca709 2004-04-19 devnull pid = 1;
66 564ca709 2004-04-19 devnull remote++;
67 564ca709 2004-04-19 devnull kernel++;
68 564ca709 2004-04-19 devnull break;
69 564ca709 2004-04-19 devnull default:
70 564ca709 2004-04-19 devnull usage();
71 564ca709 2004-04-19 devnull }ARGEND
72 564ca709 2004-04-19 devnull
73 564ca709 2004-04-19 devnull fmtinstall('x', xfmt);
74 564ca709 2004-04-19 devnull fmtinstall('Z', Zfmt);
75 564ca709 2004-04-19 devnull fmtinstall('L', locfmt);
76 564ca709 2004-04-19 devnull Binit(&bioout, 1, OWRITE);
77 564ca709 2004-04-19 devnull bout = &bioout;
78 564ca709 2004-04-19 devnull
79 e637c944 2004-04-20 devnull initexpr();
80 d2cbcb77 2004-04-20 devnull initprint();
81 564ca709 2004-04-19 devnull kinit();
82 564ca709 2004-04-19 devnull initialising = 1;
83 564ca709 2004-04-19 devnull pushfile(0);
84 564ca709 2004-04-19 devnull loadvars();
85 564ca709 2004-04-19 devnull installbuiltin();
86 564ca709 2004-04-19 devnull
87 564ca709 2004-04-19 devnull if(mtype && machbyname(mtype) == 0)
88 564ca709 2004-04-19 devnull print("unknown machine %s", mtype);
89 564ca709 2004-04-19 devnull
90 564ca709 2004-04-19 devnull if (attachfiles(argc, argv) < 0)
91 564ca709 2004-04-19 devnull varreg(); /* use default register set on error */
92 564ca709 2004-04-19 devnull if(mach == nil)
93 564ca709 2004-04-19 devnull mach = machcpu;
94 564ca709 2004-04-19 devnull
95 564ca709 2004-04-19 devnull symhdr = nil; /* not supposed to use this anymore */
96 564ca709 2004-04-19 devnull
97 564ca709 2004-04-19 devnull l = mkvar("acid");
98 564ca709 2004-04-19 devnull l->v->set = 1;
99 564ca709 2004-04-19 devnull l->v->type = TLIST;
100 564ca709 2004-04-19 devnull l->v->store.u.l = nil;
101 564ca709 2004-04-19 devnull
102 13e66070 2004-04-20 devnull loadmodule(unsharp("#9/acid/port"));
103 564ca709 2004-04-19 devnull for(i = 0; i < nlm; i++) {
104 564ca709 2004-04-19 devnull if(access(lm[i], AREAD) >= 0)
105 564ca709 2004-04-19 devnull loadmodule(lm[i]);
106 564ca709 2004-04-19 devnull else {
107 13e66070 2004-04-20 devnull sprint(buf, "#9/acid/%s", lm[i]);
108 13e66070 2004-04-20 devnull loadmodule(unsharp(buf));
109 564ca709 2004-04-19 devnull }
110 564ca709 2004-04-19 devnull }
111 564ca709 2004-04-19 devnull
112 564ca709 2004-04-19 devnull userinit();
113 564ca709 2004-04-19 devnull varsym();
114 564ca709 2004-04-19 devnull
115 564ca709 2004-04-19 devnull l = look("acidmap");
116 564ca709 2004-04-19 devnull if(l && l->proc) {
117 b4a659b6 2004-04-19 devnull if(setjmp(err) == 0){
118 b4a659b6 2004-04-19 devnull n = an(ONAME, ZN, ZN);
119 b4a659b6 2004-04-19 devnull n->sym = l;
120 b4a659b6 2004-04-19 devnull n = an(OCALL, n, ZN);
121 b4a659b6 2004-04-19 devnull execute(n);
122 b4a659b6 2004-04-19 devnull }
123 564ca709 2004-04-19 devnull }
124 564ca709 2004-04-19 devnull
125 564ca709 2004-04-19 devnull interactive = 1;
126 564ca709 2004-04-19 devnull initialising = 0;
127 564ca709 2004-04-19 devnull line = 1;
128 564ca709 2004-04-19 devnull
129 564ca709 2004-04-19 devnull notify(catcher);
130 564ca709 2004-04-19 devnull
131 564ca709 2004-04-19 devnull for(;;) {
132 564ca709 2004-04-19 devnull if(setjmp(err)) {
133 564ca709 2004-04-19 devnull Binit(&bioout, 1, OWRITE);
134 564ca709 2004-04-19 devnull unwind();
135 564ca709 2004-04-19 devnull }
136 564ca709 2004-04-19 devnull stacked = 0;
137 564ca709 2004-04-19 devnull
138 564ca709 2004-04-19 devnull Bprint(bout, "acid; ");
139 564ca709 2004-04-19 devnull
140 564ca709 2004-04-19 devnull if(yyparse() != 1)
141 564ca709 2004-04-19 devnull die();
142 564ca709 2004-04-19 devnull restartio();
143 564ca709 2004-04-19 devnull
144 564ca709 2004-04-19 devnull unwind();
145 564ca709 2004-04-19 devnull }
146 564ca709 2004-04-19 devnull Bputc(bout, '\n');
147 564ca709 2004-04-19 devnull exits(0);
148 564ca709 2004-04-19 devnull }
149 564ca709 2004-04-19 devnull
150 564ca709 2004-04-19 devnull static int
151 564ca709 2004-04-19 devnull attachfiles(int argc, char **argv)
152 564ca709 2004-04-19 devnull {
153 b4a659b6 2004-04-19 devnull int pid;
154 564ca709 2004-04-19 devnull char *s;
155 564ca709 2004-04-19 devnull int i, omode;
156 564ca709 2004-04-19 devnull Fhdr *hdr;
157 564ca709 2004-04-19 devnull Lsym *l;
158 564ca709 2004-04-19 devnull Value *v;
159 564ca709 2004-04-19 devnull
160 b4a659b6 2004-04-19 devnull pid = 0;
161 564ca709 2004-04-19 devnull interactive = 0;
162 564ca709 2004-04-19 devnull if(setjmp(err))
163 564ca709 2004-04-19 devnull return -1;
164 564ca709 2004-04-19 devnull
165 564ca709 2004-04-19 devnull /*
166 564ca709 2004-04-19 devnull * Unix and Plan 9 differ on what the right order of pid, text, and core is.
167 564ca709 2004-04-19 devnull * I never remember anyway. Let's just accept them in any order.
168 564ca709 2004-04-19 devnull */
169 564ca709 2004-04-19 devnull omode = wtflag ? ORDWR : OREAD;
170 564ca709 2004-04-19 devnull for(i=0; i<argc; i++){
171 564ca709 2004-04-19 devnull if(isnumeric(argv[i])){
172 564ca709 2004-04-19 devnull if(pid){
173 564ca709 2004-04-19 devnull fprint(2, "already have pid %d; ignoring pid %d\n", pid, argv[i]);
174 564ca709 2004-04-19 devnull continue;
175 564ca709 2004-04-19 devnull }
176 564ca709 2004-04-19 devnull if(corhdr){
177 564ca709 2004-04-19 devnull fprint(2, "already have core %s; ignoring pid %d\n", corfil, pid);
178 564ca709 2004-04-19 devnull continue;
179 564ca709 2004-04-19 devnull }
180 564ca709 2004-04-19 devnull pid = atoi(argv[i]);
181 564ca709 2004-04-19 devnull continue;
182 564ca709 2004-04-19 devnull }
183 564ca709 2004-04-19 devnull if((hdr = crackhdr(argv[i], omode)) == nil){
184 564ca709 2004-04-19 devnull fprint(2, "crackhdr %s: %r\n", argv[i]);
185 564ca709 2004-04-19 devnull continue;
186 564ca709 2004-04-19 devnull }
187 564ca709 2004-04-19 devnull fprint(2, "%s: %s %s %s\n", argv[i], hdr->aname, hdr->mname, hdr->fname);
188 564ca709 2004-04-19 devnull if(hdr->ftype == FCORE){
189 564ca709 2004-04-19 devnull if(pid){
190 564ca709 2004-04-19 devnull fprint(2, "already have pid %d; ignoring core %s\n", pid, argv[i]);
191 564ca709 2004-04-19 devnull uncrackhdr(hdr);
192 564ca709 2004-04-19 devnull continue;
193 564ca709 2004-04-19 devnull }
194 564ca709 2004-04-19 devnull if(corhdr){
195 564ca709 2004-04-19 devnull fprint(2, "already have core %s; ignoring core %s\n", corfil, argv[i]);
196 564ca709 2004-04-19 devnull uncrackhdr(hdr);
197 564ca709 2004-04-19 devnull continue;
198 564ca709 2004-04-19 devnull }
199 564ca709 2004-04-19 devnull corhdr = hdr;
200 564ca709 2004-04-19 devnull corfil = argv[i];
201 564ca709 2004-04-19 devnull }else{
202 564ca709 2004-04-19 devnull if(symhdr){
203 564ca709 2004-04-19 devnull fprint(2, "already have text %s; ignoring text %s\n", symfil, argv[i]);
204 564ca709 2004-04-19 devnull uncrackhdr(hdr);
205 564ca709 2004-04-19 devnull continue;
206 564ca709 2004-04-19 devnull }
207 564ca709 2004-04-19 devnull symhdr = hdr;
208 564ca709 2004-04-19 devnull symfil = argv[i];
209 564ca709 2004-04-19 devnull }
210 564ca709 2004-04-19 devnull }
211 564ca709 2004-04-19 devnull
212 564ca709 2004-04-19 devnull if(symhdr==nil){
213 564ca709 2004-04-19 devnull symfil = "a.out";
214 564ca709 2004-04-19 devnull if(pid){
215 564ca709 2004-04-19 devnull if((s = proctextfile(pid)) != nil){
216 564ca709 2004-04-19 devnull fprint(2, "pid %d: text %s\n", pid, s);
217 564ca709 2004-04-19 devnull symfil = s;
218 564ca709 2004-04-19 devnull }
219 564ca709 2004-04-19 devnull }
220 564ca709 2004-04-19 devnull /* XXX pull command from core */
221 564ca709 2004-04-19 devnull
222 c2a9c3bb 2004-04-19 devnull if((symhdr = crackhdr(symfil, omode)) == nil){
223 564ca709 2004-04-19 devnull fprint(2, "crackhdr %s: %r\n", symfil);
224 564ca709 2004-04-19 devnull symfil = nil;
225 564ca709 2004-04-19 devnull }
226 564ca709 2004-04-19 devnull }
227 564ca709 2004-04-19 devnull
228 564ca709 2004-04-19 devnull if(symhdr)
229 564ca709 2004-04-19 devnull syminit(symhdr);
230 564ca709 2004-04-19 devnull
231 564ca709 2004-04-19 devnull if(!mach)
232 564ca709 2004-04-19 devnull mach = machcpu;
233 564ca709 2004-04-19 devnull
234 564ca709 2004-04-19 devnull /*
235 564ca709 2004-04-19 devnull * Set up maps.
236 564ca709 2004-04-19 devnull */
237 564ca709 2004-04-19 devnull symmap = allocmap();
238 564ca709 2004-04-19 devnull cormap = allocmap();
239 564ca709 2004-04-19 devnull if(symmap == nil || cormap == nil)
240 564ca709 2004-04-19 devnull sysfatal("allocating maps: %r");
241 564ca709 2004-04-19 devnull
242 564ca709 2004-04-19 devnull if(symhdr){
243 564ca709 2004-04-19 devnull if(mapfile(symhdr, 0, symmap, nil) < 0)
244 564ca709 2004-04-19 devnull fprint(2, "mapping %s: %r\n", symfil);
245 564ca709 2004-04-19 devnull mapfile(symhdr, 0, cormap, nil);
246 564ca709 2004-04-19 devnull }
247 564ca709 2004-04-19 devnull
248 564ca709 2004-04-19 devnull l = mkvar("objtype");
249 564ca709 2004-04-19 devnull v = l->v;
250 564ca709 2004-04-19 devnull v->store.fmt = 's';
251 564ca709 2004-04-19 devnull v->set = 1;
252 564ca709 2004-04-19 devnull v->store.u.string = strnode(mach->name);
253 564ca709 2004-04-19 devnull v->type = TSTRING;
254 564ca709 2004-04-19 devnull
255 564ca709 2004-04-19 devnull l = mkvar("textfile");
256 564ca709 2004-04-19 devnull v = l->v;
257 564ca709 2004-04-19 devnull v->store.fmt = 's';
258 564ca709 2004-04-19 devnull v->set = 1;
259 564ca709 2004-04-19 devnull v->store.u.string = strnode(symfil ? symfil : "");
260 564ca709 2004-04-19 devnull v->type = TSTRING;
261 564ca709 2004-04-19 devnull
262 564ca709 2004-04-19 devnull l = mkvar("systype");
263 564ca709 2004-04-19 devnull v = l->v;
264 564ca709 2004-04-19 devnull v->store.fmt = 's';
265 564ca709 2004-04-19 devnull v->set = 1;
266 564ca709 2004-04-19 devnull v->store.u.string = strnode(symhdr ? symhdr->aname : "");
267 564ca709 2004-04-19 devnull v->type = TSTRING;
268 564ca709 2004-04-19 devnull
269 564ca709 2004-04-19 devnull l = mkvar("corefile");
270 564ca709 2004-04-19 devnull v = l->v;
271 564ca709 2004-04-19 devnull v->store.fmt = 's';
272 564ca709 2004-04-19 devnull v->set = 1;
273 564ca709 2004-04-19 devnull v->store.u.string = strnode(corfil ? corfil : "");
274 564ca709 2004-04-19 devnull v->type = TSTRING;
275 564ca709 2004-04-19 devnull
276 564ca709 2004-04-19 devnull if(pid)
277 564ca709 2004-04-19 devnull sproc(pid);
278 564ca709 2004-04-19 devnull if(corhdr)
279 564ca709 2004-04-19 devnull setcore(corhdr);
280 564ca709 2004-04-19 devnull varreg();
281 564ca709 2004-04-19 devnull return 0;
282 564ca709 2004-04-19 devnull }
283 564ca709 2004-04-19 devnull
284 564ca709 2004-04-19 devnull void
285 564ca709 2004-04-19 devnull setcore(Fhdr *hdr)
286 564ca709 2004-04-19 devnull {
287 564ca709 2004-04-19 devnull unmapproc(cormap);
288 564ca709 2004-04-19 devnull unmapfile(corhdr, cormap);
289 564ca709 2004-04-19 devnull free(correg);
290 564ca709 2004-04-19 devnull correg = nil;
291 564ca709 2004-04-19 devnull
292 564ca709 2004-04-19 devnull if(hdr == nil)
293 564ca709 2004-04-19 devnull error("no core");
294 564ca709 2004-04-19 devnull if(mapfile(hdr, 0, cormap, &correg) < 0)
295 564ca709 2004-04-19 devnull error("mapfile %s: %r", hdr->filename);
296 564ca709 2004-04-19 devnull corhdr = hdr;
297 564ca709 2004-04-19 devnull corfil = hdr->filename;
298 564ca709 2004-04-19 devnull }
299 564ca709 2004-04-19 devnull
300 564ca709 2004-04-19 devnull void
301 564ca709 2004-04-19 devnull die(void)
302 564ca709 2004-04-19 devnull {
303 564ca709 2004-04-19 devnull Lsym *s;
304 564ca709 2004-04-19 devnull List *f;
305 564ca709 2004-04-19 devnull
306 564ca709 2004-04-19 devnull Bprint(bout, "\n");
307 564ca709 2004-04-19 devnull
308 564ca709 2004-04-19 devnull s = look("proclist");
309 564ca709 2004-04-19 devnull if(s && s->v->type == TLIST) {
310 564ca709 2004-04-19 devnull for(f = s->v->store.u.l; f; f = f->next){
311 564ca709 2004-04-19 devnull detachproc((int)f->store.u.ival);
312 564ca709 2004-04-19 devnull Bprint(bout, "/bin/kill -9 %d\n", (int)f->store.u.ival);
313 564ca709 2004-04-19 devnull }
314 564ca709 2004-04-19 devnull }
315 564ca709 2004-04-19 devnull exits(0);
316 564ca709 2004-04-19 devnull }
317 564ca709 2004-04-19 devnull
318 564ca709 2004-04-19 devnull void
319 564ca709 2004-04-19 devnull userinit(void)
320 564ca709 2004-04-19 devnull {
321 564ca709 2004-04-19 devnull Lsym *l;
322 564ca709 2004-04-19 devnull Node *n;
323 564ca709 2004-04-19 devnull char buf[128], *p;
324 564ca709 2004-04-19 devnull
325 13e66070 2004-04-20 devnull sprint(buf, "#9/acid/%s", mach->name);
326 13e66070 2004-04-20 devnull loadmodule(unsharp(buf));
327 564ca709 2004-04-19 devnull p = getenv("home");
328 564ca709 2004-04-19 devnull if(p != 0) {
329 564ca709 2004-04-19 devnull sprint(buf, "%s/lib/acid", p);
330 564ca709 2004-04-19 devnull silent = 1;
331 564ca709 2004-04-19 devnull loadmodule(buf);
332 564ca709 2004-04-19 devnull }
333 564ca709 2004-04-19 devnull
334 564ca709 2004-04-19 devnull interactive = 0;
335 564ca709 2004-04-19 devnull if(setjmp(err)) {
336 564ca709 2004-04-19 devnull unwind();
337 564ca709 2004-04-19 devnull return;
338 564ca709 2004-04-19 devnull }
339 564ca709 2004-04-19 devnull l = look("acidinit");
340 564ca709 2004-04-19 devnull if(l && l->proc) {
341 564ca709 2004-04-19 devnull n = an(ONAME, ZN, ZN);
342 564ca709 2004-04-19 devnull n->sym = l;
343 564ca709 2004-04-19 devnull n = an(OCALL, n, ZN);
344 564ca709 2004-04-19 devnull execute(n);
345 564ca709 2004-04-19 devnull }
346 564ca709 2004-04-19 devnull }
347 564ca709 2004-04-19 devnull
348 564ca709 2004-04-19 devnull void
349 564ca709 2004-04-19 devnull loadmodule(char *s)
350 564ca709 2004-04-19 devnull {
351 564ca709 2004-04-19 devnull interactive = 0;
352 564ca709 2004-04-19 devnull if(setjmp(err)) {
353 564ca709 2004-04-19 devnull unwind();
354 564ca709 2004-04-19 devnull return;
355 564ca709 2004-04-19 devnull }
356 564ca709 2004-04-19 devnull pushfile(s);
357 564ca709 2004-04-19 devnull silent = 0;
358 564ca709 2004-04-19 devnull yyparse();
359 564ca709 2004-04-19 devnull popio();
360 564ca709 2004-04-19 devnull return;
361 564ca709 2004-04-19 devnull }
362 564ca709 2004-04-19 devnull
363 564ca709 2004-04-19 devnull Node*
364 564ca709 2004-04-19 devnull an(int op, Node *l, Node *r)
365 564ca709 2004-04-19 devnull {
366 564ca709 2004-04-19 devnull Node *n;
367 564ca709 2004-04-19 devnull
368 564ca709 2004-04-19 devnull n = gmalloc(sizeof(Node));
369 564ca709 2004-04-19 devnull memset(n, 0, sizeof(Node));
370 564ca709 2004-04-19 devnull n->gc.gclink = gcl;
371 564ca709 2004-04-19 devnull gcl = (Gc*)n;
372 564ca709 2004-04-19 devnull n->op = op;
373 564ca709 2004-04-19 devnull n->left = l;
374 564ca709 2004-04-19 devnull n->right = r;
375 564ca709 2004-04-19 devnull return n;
376 564ca709 2004-04-19 devnull }
377 564ca709 2004-04-19 devnull
378 564ca709 2004-04-19 devnull List*
379 564ca709 2004-04-19 devnull al(int t)
380 564ca709 2004-04-19 devnull {
381 564ca709 2004-04-19 devnull List *l;
382 564ca709 2004-04-19 devnull
383 564ca709 2004-04-19 devnull l = gmalloc(sizeof(List));
384 564ca709 2004-04-19 devnull memset(l, 0, sizeof(List));
385 564ca709 2004-04-19 devnull l->type = t;
386 564ca709 2004-04-19 devnull l->gc.gclink = gcl;
387 564ca709 2004-04-19 devnull gcl = (Gc*)l;
388 564ca709 2004-04-19 devnull return l;
389 564ca709 2004-04-19 devnull }
390 564ca709 2004-04-19 devnull
391 564ca709 2004-04-19 devnull Node*
392 564ca709 2004-04-19 devnull con(int v)
393 564ca709 2004-04-19 devnull {
394 564ca709 2004-04-19 devnull Node *n;
395 564ca709 2004-04-19 devnull
396 564ca709 2004-04-19 devnull n = an(OCONST, ZN, ZN);
397 564ca709 2004-04-19 devnull n->store.u.ival = v;
398 564ca709 2004-04-19 devnull n->store.fmt = 'X';
399 564ca709 2004-04-19 devnull n->type = TINT;
400 564ca709 2004-04-19 devnull return n;
401 564ca709 2004-04-19 devnull }
402 564ca709 2004-04-19 devnull
403 564ca709 2004-04-19 devnull void
404 564ca709 2004-04-19 devnull fatal(char *fmt, ...)
405 564ca709 2004-04-19 devnull {
406 564ca709 2004-04-19 devnull char buf[128];
407 564ca709 2004-04-19 devnull va_list arg;
408 564ca709 2004-04-19 devnull
409 564ca709 2004-04-19 devnull va_start(arg, fmt);
410 564ca709 2004-04-19 devnull vseprint(buf, buf+sizeof(buf), fmt, arg);
411 564ca709 2004-04-19 devnull va_end(arg);
412 564ca709 2004-04-19 devnull fprint(2, "%s: %Z (fatal problem) %s\n", argv0, buf);
413 564ca709 2004-04-19 devnull exits(buf);
414 564ca709 2004-04-19 devnull }
415 564ca709 2004-04-19 devnull
416 564ca709 2004-04-19 devnull void
417 564ca709 2004-04-19 devnull yyerror(char *fmt, ...)
418 564ca709 2004-04-19 devnull {
419 564ca709 2004-04-19 devnull char buf[128];
420 564ca709 2004-04-19 devnull va_list arg;
421 564ca709 2004-04-19 devnull
422 564ca709 2004-04-19 devnull if(strcmp(fmt, "syntax error") == 0) {
423 564ca709 2004-04-19 devnull yyerror("syntax error, near symbol '%s'", symbol);
424 564ca709 2004-04-19 devnull return;
425 564ca709 2004-04-19 devnull }
426 564ca709 2004-04-19 devnull va_start(arg, fmt);
427 564ca709 2004-04-19 devnull vseprint(buf, buf+sizeof(buf), fmt, arg);
428 564ca709 2004-04-19 devnull va_end(arg);
429 564ca709 2004-04-19 devnull print("%Z: %s\n", buf);
430 564ca709 2004-04-19 devnull }
431 564ca709 2004-04-19 devnull
432 564ca709 2004-04-19 devnull void
433 564ca709 2004-04-19 devnull marktree(Node *n)
434 564ca709 2004-04-19 devnull {
435 564ca709 2004-04-19 devnull
436 564ca709 2004-04-19 devnull if(n == 0)
437 564ca709 2004-04-19 devnull return;
438 564ca709 2004-04-19 devnull
439 564ca709 2004-04-19 devnull marktree(n->left);
440 564ca709 2004-04-19 devnull marktree(n->right);
441 564ca709 2004-04-19 devnull
442 564ca709 2004-04-19 devnull n->gc.gcmark = 1;
443 564ca709 2004-04-19 devnull if(n->op != OCONST)
444 564ca709 2004-04-19 devnull return;
445 564ca709 2004-04-19 devnull
446 564ca709 2004-04-19 devnull switch(n->type) {
447 564ca709 2004-04-19 devnull case TSTRING:
448 564ca709 2004-04-19 devnull n->store.u.string->gc.gcmark = 1;
449 564ca709 2004-04-19 devnull break;
450 564ca709 2004-04-19 devnull case TLIST:
451 564ca709 2004-04-19 devnull marklist(n->store.u.l);
452 564ca709 2004-04-19 devnull break;
453 564ca709 2004-04-19 devnull case TCODE:
454 564ca709 2004-04-19 devnull marktree(n->store.u.cc);
455 564ca709 2004-04-19 devnull break;
456 564ca709 2004-04-19 devnull }
457 564ca709 2004-04-19 devnull }
458 564ca709 2004-04-19 devnull
459 564ca709 2004-04-19 devnull void
460 564ca709 2004-04-19 devnull marklist(List *l)
461 564ca709 2004-04-19 devnull {
462 564ca709 2004-04-19 devnull while(l) {
463 564ca709 2004-04-19 devnull l->gc.gcmark = 1;
464 564ca709 2004-04-19 devnull switch(l->type) {
465 564ca709 2004-04-19 devnull case TSTRING:
466 564ca709 2004-04-19 devnull l->store.u.string->gc.gcmark = 1;
467 564ca709 2004-04-19 devnull break;
468 564ca709 2004-04-19 devnull case TLIST:
469 564ca709 2004-04-19 devnull marklist(l->store.u.l);
470 564ca709 2004-04-19 devnull break;
471 564ca709 2004-04-19 devnull case TCODE:
472 564ca709 2004-04-19 devnull marktree(l->store.u.cc);
473 564ca709 2004-04-19 devnull break;
474 564ca709 2004-04-19 devnull }
475 564ca709 2004-04-19 devnull l = l->next;
476 564ca709 2004-04-19 devnull }
477 564ca709 2004-04-19 devnull }
478 564ca709 2004-04-19 devnull
479 564ca709 2004-04-19 devnull void
480 564ca709 2004-04-19 devnull gc(void)
481 564ca709 2004-04-19 devnull {
482 564ca709 2004-04-19 devnull int i;
483 564ca709 2004-04-19 devnull Lsym *f;
484 564ca709 2004-04-19 devnull Value *v;
485 564ca709 2004-04-19 devnull Gc *m, **p, *next;
486 564ca709 2004-04-19 devnull
487 564ca709 2004-04-19 devnull if(dogc < Mempergc)
488 564ca709 2004-04-19 devnull return;
489 564ca709 2004-04-19 devnull dogc = 0;
490 564ca709 2004-04-19 devnull
491 564ca709 2004-04-19 devnull /* Mark */
492 564ca709 2004-04-19 devnull for(m = gcl; m; m = m->gclink)
493 564ca709 2004-04-19 devnull m->gcmark = 0;
494 564ca709 2004-04-19 devnull
495 564ca709 2004-04-19 devnull /* Scan */
496 564ca709 2004-04-19 devnull for(i = 0; i < Hashsize; i++) {
497 564ca709 2004-04-19 devnull for(f = hash[i]; f; f = f->hash) {
498 564ca709 2004-04-19 devnull marktree(f->proc);
499 564ca709 2004-04-19 devnull if(f->lexval != Tid)
500 564ca709 2004-04-19 devnull continue;
501 564ca709 2004-04-19 devnull for(v = f->v; v; v = v->pop) {
502 564ca709 2004-04-19 devnull switch(v->type) {
503 564ca709 2004-04-19 devnull case TSTRING:
504 564ca709 2004-04-19 devnull v->store.u.string->gc.gcmark = 1;
505 564ca709 2004-04-19 devnull break;
506 564ca709 2004-04-19 devnull case TLIST:
507 564ca709 2004-04-19 devnull marklist(v->store.u.l);
508 564ca709 2004-04-19 devnull break;
509 564ca709 2004-04-19 devnull case TCODE:
510 564ca709 2004-04-19 devnull marktree(v->store.u.cc);
511 564ca709 2004-04-19 devnull break;
512 564ca709 2004-04-19 devnull }
513 564ca709 2004-04-19 devnull }
514 564ca709 2004-04-19 devnull }
515 564ca709 2004-04-19 devnull }
516 564ca709 2004-04-19 devnull
517 564ca709 2004-04-19 devnull /* Free */
518 564ca709 2004-04-19 devnull p = &gcl;
519 564ca709 2004-04-19 devnull for(m = gcl; m; m = next) {
520 564ca709 2004-04-19 devnull next = m->gclink;
521 564ca709 2004-04-19 devnull if(m->gcmark == 0) {
522 564ca709 2004-04-19 devnull *p = next;
523 564ca709 2004-04-19 devnull free(m); /* Sleazy reliance on my malloc */
524 564ca709 2004-04-19 devnull }
525 564ca709 2004-04-19 devnull else
526 564ca709 2004-04-19 devnull p = &m->gclink;
527 564ca709 2004-04-19 devnull }
528 564ca709 2004-04-19 devnull }
529 564ca709 2004-04-19 devnull
530 564ca709 2004-04-19 devnull void*
531 564ca709 2004-04-19 devnull gmalloc(long l)
532 564ca709 2004-04-19 devnull {
533 564ca709 2004-04-19 devnull void *p;
534 564ca709 2004-04-19 devnull
535 564ca709 2004-04-19 devnull dogc += l;
536 564ca709 2004-04-19 devnull p = malloc(l);
537 564ca709 2004-04-19 devnull if(p == 0)
538 564ca709 2004-04-19 devnull fatal("out of memory");
539 564ca709 2004-04-19 devnull return p;
540 564ca709 2004-04-19 devnull }
541 564ca709 2004-04-19 devnull
542 564ca709 2004-04-19 devnull void
543 564ca709 2004-04-19 devnull checkqid(int f1, int pid)
544 564ca709 2004-04-19 devnull {
545 564ca709 2004-04-19 devnull int fd;
546 564ca709 2004-04-19 devnull Dir *d1, *d2;
547 564ca709 2004-04-19 devnull char buf[128];
548 564ca709 2004-04-19 devnull
549 564ca709 2004-04-19 devnull if(kernel)
550 564ca709 2004-04-19 devnull return;
551 564ca709 2004-04-19 devnull
552 564ca709 2004-04-19 devnull d1 = dirfstat(f1);
553 564ca709 2004-04-19 devnull if(d1 == nil){
554 564ca709 2004-04-19 devnull print("checkqid: (qid not checked) dirfstat: %r\n");
555 564ca709 2004-04-19 devnull return;
556 564ca709 2004-04-19 devnull }
557 564ca709 2004-04-19 devnull
558 564ca709 2004-04-19 devnull sprint(buf, "/proc/%d/text", pid);
559 564ca709 2004-04-19 devnull fd = open(buf, OREAD);
560 564ca709 2004-04-19 devnull if(fd < 0 || (d2 = dirfstat(fd)) == nil){
561 564ca709 2004-04-19 devnull print("checkqid: (qid not checked) dirstat %s: %r\n", buf);
562 564ca709 2004-04-19 devnull free(d1);
563 564ca709 2004-04-19 devnull if(fd >= 0)
564 564ca709 2004-04-19 devnull close(fd);
565 564ca709 2004-04-19 devnull return;
566 564ca709 2004-04-19 devnull }
567 564ca709 2004-04-19 devnull
568 564ca709 2004-04-19 devnull close(fd);
569 564ca709 2004-04-19 devnull
570 564ca709 2004-04-19 devnull if(d1->qid.path != d2->qid.path || d1->qid.vers != d2->qid.vers || d1->qid.type != d2->qid.type){
571 564ca709 2004-04-19 devnull print("path %llux %llux vers %lud %lud type %d %d\n",
572 564ca709 2004-04-19 devnull d1->qid.path, d2->qid.path, d1->qid.vers, d2->qid.vers, d1->qid.type, d2->qid.type);
573 564ca709 2004-04-19 devnull print("warning: image does not match text for pid %d\n", pid);
574 564ca709 2004-04-19 devnull }
575 564ca709 2004-04-19 devnull free(d1);
576 564ca709 2004-04-19 devnull free(d2);
577 564ca709 2004-04-19 devnull }
578 564ca709 2004-04-19 devnull
579 564ca709 2004-04-19 devnull void
580 564ca709 2004-04-19 devnull catcher(void *junk, char *s)
581 564ca709 2004-04-19 devnull {
582 564ca709 2004-04-19 devnull USED(junk);
583 564ca709 2004-04-19 devnull
584 564ca709 2004-04-19 devnull if(strstr(s, "interrupt")) {
585 564ca709 2004-04-19 devnull gotint = 1;
586 564ca709 2004-04-19 devnull noted(NCONT);
587 564ca709 2004-04-19 devnull }
588 564ca709 2004-04-19 devnull if(strstr(s, "child"))
589 564ca709 2004-04-19 devnull noted(NCONT);
590 564ca709 2004-04-19 devnull fprint(2, "note: %s\n", s);
591 564ca709 2004-04-19 devnull noted(NDFLT);
592 564ca709 2004-04-19 devnull }
593 564ca709 2004-04-19 devnull
594 564ca709 2004-04-19 devnull char*
595 564ca709 2004-04-19 devnull system(void)
596 564ca709 2004-04-19 devnull {
597 564ca709 2004-04-19 devnull char *cpu, *p, *q;
598 564ca709 2004-04-19 devnull static char kernel[128];
599 564ca709 2004-04-19 devnull
600 564ca709 2004-04-19 devnull cpu = getenv("cputype");
601 564ca709 2004-04-19 devnull if(cpu == 0) {
602 564ca709 2004-04-19 devnull cpu = "mips";
603 564ca709 2004-04-19 devnull print("$cputype not set; assuming %s\n", cpu);
604 564ca709 2004-04-19 devnull }
605 564ca709 2004-04-19 devnull p = getenv("terminal");
606 564ca709 2004-04-19 devnull if(p == 0 || (p=strchr(p, ' ')) == 0 || p[1] == ' ' || p[1] == 0) {
607 564ca709 2004-04-19 devnull p = "9power";
608 564ca709 2004-04-19 devnull print("missing or bad $terminal; assuming %s\n", p);
609 564ca709 2004-04-19 devnull }
610 564ca709 2004-04-19 devnull else{
611 564ca709 2004-04-19 devnull p++;
612 564ca709 2004-04-19 devnull q = strchr(p, ' ');
613 564ca709 2004-04-19 devnull if(q)
614 564ca709 2004-04-19 devnull *q = 0;
615 564ca709 2004-04-19 devnull sprint(kernel, "/%s/9%s", cpu, p);
616 564ca709 2004-04-19 devnull }
617 564ca709 2004-04-19 devnull return kernel;
618 564ca709 2004-04-19 devnull }
619 564ca709 2004-04-19 devnull
620 564ca709 2004-04-19 devnull int
621 564ca709 2004-04-19 devnull isnumeric(char *s)
622 564ca709 2004-04-19 devnull {
623 564ca709 2004-04-19 devnull while(*s) {
624 564ca709 2004-04-19 devnull if(*s < '0' || *s > '9')
625 564ca709 2004-04-19 devnull return 0;
626 564ca709 2004-04-19 devnull s++;
627 564ca709 2004-04-19 devnull }
628 564ca709 2004-04-19 devnull return 1;
629 564ca709 2004-04-19 devnull }
630 564ca709 2004-04-19 devnull
631 564ca709 2004-04-19 devnull int
632 564ca709 2004-04-19 devnull xfmt(Fmt *f)
633 564ca709 2004-04-19 devnull {
634 564ca709 2004-04-19 devnull f->flags ^= FmtSharp;
635 564ca709 2004-04-19 devnull return __ifmt(f);
636 564ca709 2004-04-19 devnull }