Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <mach.h>
5 char *coredir(void);
6 void coreall(char*);
7 void corefile(char*, int);
9 void
10 usage(void)
11 {
12 fprint(2, "usage: core [dir | corefile]...\n");
13 exits("usage");
14 }
16 void
17 main(int argc, char **argv)
18 {
19 int i;
21 ARGBEGIN{
22 default:
23 usage();
24 }ARGEND
26 if(argc == 0){
27 argc++;
28 *--argv = coredir();
29 }
31 for(i=0; i<argc; i++)
32 coreall(argv[i]);
33 }
35 char*
36 coredir(void)
37 {
38 char *dir;
40 dir = getenv("COREDIR");
41 if(dir == nil)
42 dir = ".";
43 return dir;
44 }
46 int
47 timecmp(const void *va, const void *vb)
48 {
49 Dir *a, *b;
51 a = (Dir*)va;
52 b = (Dir*)vb;
53 if(a->mtime < b->mtime)
54 return 1;
55 if(a->mtime > b->mtime)
56 return -1;
57 return 0;
58 }
60 void
61 coreall(char *name)
62 {
63 Dir *d;
64 int fd, i, n;
65 char *p;
67 if((d = dirstat(name)) == nil){
68 fprint(2, "%s: %r\n", name);
69 return;
70 }
71 if((d->mode&DMDIR) == 0)
72 corefile(name, 1);
73 free(d);
74 if((fd = open(name, OREAD)) < 0){
75 fprint(2, "open %s: %r\n", name);
76 return;
77 }
78 n = dirreadall(fd, &d);
79 qsort(d, n, sizeof(d[0]), timecmp);
80 for(i=0; i<n; i++){
81 p = smprint("%s/%s", name, d[i].name);
82 if(p == nil)
83 sysfatal("out of memory");
84 corefile(p, 0);
85 free(p);
86 }
87 }
89 void
90 corefile(char *name, int explicit)
91 {
92 Fhdr *hdr;
93 char t[100];
94 Dir *d;
96 if((d = dirstat(name)) == nil){
97 if(explicit)
98 fprint(2, "%s; %r\n", name);
99 return;
101 strcpy(t, ctime(d->mtime));
102 t[strlen(t)-1] = 0; /* newline */
104 if((hdr = crackhdr(name, OREAD)) == nil){
105 if(explicit)
106 fprint(2, "%s: %r\n", name);
107 return;
109 if(hdr->ftype != FCORE){
110 uncrackhdr(hdr);
111 if(explicit)
112 fprint(2, "%s: not a core file\n", name);
113 return;
115 print("stack %s\n\t# %s\n\t# %s\n", name, t, hdr->cmdline);
116 uncrackhdr(hdr);