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 free(d);
73 corefile(name, 1);
74 return;
75 }
76 free(d);
77 if((fd = open(name, OREAD)) < 0){
78 fprint(2, "open %s: %r\n", name);
79 return;
80 }
81 n = dirreadall(fd, &d);
82 qsort(d, n, sizeof(d[0]), timecmp);
83 for(i=0; i<n; i++){
84 p = smprint("%s/%s", name, d[i].name);
85 if(p == nil)
86 sysfatal("out of memory");
87 corefile(p, 0);
88 free(p);
89 }
90 }
92 void
93 corefile(char *name, int explicit)
94 {
95 Fhdr *hdr;
96 char t[100];
97 Dir *d;
99 if((d = dirstat(name)) == nil){
100 if(explicit)
101 fprint(2, "%s; %r\n", name);
102 return;
104 strcpy(t, ctime(d->mtime));
105 t[strlen(t)-1] = 0; /* newline */
107 if((hdr = crackhdr(name, OREAD)) == nil){
108 if(explicit)
109 fprint(2, "%s: %r\n", name);
110 return;
112 if(hdr->ftype != FCORE){
113 uncrackhdr(hdr);
114 if(explicit)
115 fprint(2, "%s: not a core file\n", name);
116 return;
118 print("stack %s\n\t# %s\n\t# %s\n", name, t, hdr->cmdline);
119 uncrackhdr(hdr);