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>
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);
10 58698c9c 2005-01-18 devnull usage(void)
12 58698c9c 2005-01-18 devnull fprint(2, "usage: core [dir | corefile]...\n");
13 58698c9c 2005-01-18 devnull exits("usage");
17 58698c9c 2005-01-18 devnull main(int argc, char **argv)
21 58698c9c 2005-01-18 devnull ARGBEGIN{
26 58698c9c 2005-01-18 devnull if(argc == 0){
28 58698c9c 2005-01-18 devnull *--argv = coredir();
31 58698c9c 2005-01-18 devnull for(i=0; i<argc; i++)
32 58698c9c 2005-01-18 devnull coreall(argv[i]);
36 58698c9c 2005-01-18 devnull coredir(void)
38 58698c9c 2005-01-18 devnull char *dir;
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;
47 d925d643 2005-01-23 devnull timecmp(const void *va, const void *vb)
49 d925d643 2005-01-23 devnull Dir *a, *b;
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;
61 58698c9c 2005-01-18 devnull coreall(char *name)
64 58698c9c 2005-01-18 devnull int fd, i, n;
67 58698c9c 2005-01-18 devnull if((d = dirstat(name)) == nil){
68 58698c9c 2005-01-18 devnull fprint(2, "%s: %r\n", name);
71 98e19d6d 2005-01-30 devnull if((d->mode&DMDIR) == 0){
73 58698c9c 2005-01-18 devnull corefile(name, 1);
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);
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);
93 58698c9c 2005-01-18 devnull corefile(char *name, int explicit)
95 58698c9c 2005-01-18 devnull Fhdr *hdr;
96 58698c9c 2005-01-18 devnull char t[100];
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);
104 58698c9c 2005-01-18 devnull strcpy(t, ctime(d->mtime));
105 58698c9c 2005-01-18 devnull t[strlen(t)-1] = 0; /* newline */
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);
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);
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);