Blame


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