| #include <u.h> |
| #include <libc.h> |
| #include <mach.h> |
| |
| char *coredir(void); |
| void coreall(char*); |
| void corefile(char*, int); |
| |
| void |
| usage(void) |
| { |
| fprint(2, "usage: core [dir | corefile]...\n"); |
| exits("usage"); |
| } |
| |
| void |
| main(int argc, char **argv) |
| { |
| int i; |
| |
| ARGBEGIN{ |
| default: |
| usage(); |
| }ARGEND |
| |
| if(argc == 0){ |
| argc++; |
| *--argv = coredir(); |
| } |
| |
| for(i=0; i<argc; i++) |
| coreall(argv[i]); |
| } |
| |
| char* |
| coredir(void) |
| { |
| char *dir; |
| |
| dir = getenv("COREDIR"); |
| if(dir == nil) |
| dir = "."; |
| return dir; |
| } |
| |
| int |
| timecmp(const void *va, const void *vb) |
| { |
| Dir *a, *b; |
| |
| a = (Dir*)va; |
| b = (Dir*)vb; |
| if(a->mtime < b->mtime) |
| return 1; |
| if(a->mtime > b->mtime) |
| return -1; |
| return 0; |
| } |
| |
| void |
| coreall(char *name) |
| { |
| Dir *d; |
| int fd, i, n; |
| char *p; |
| |
| if((d = dirstat(name)) == nil){ |
| fprint(2, "%s: %r\n", name); |
| return; |
| } |
| if((d->mode&DMDIR) == 0){ |
| free(d); |
| corefile(name, 1); |
| return; |
| } |
| free(d); |
| if((fd = open(name, OREAD)) < 0){ |
| fprint(2, "open %s: %r\n", name); |
| return; |
| } |
| n = dirreadall(fd, &d); |
| qsort(d, n, sizeof(d[0]), timecmp); |
| for(i=0; i<n; i++){ |
| p = smprint("%s/%s", name, d[i].name); |
| if(p == nil) |
| sysfatal("out of memory"); |
| corefile(p, 0); |
| free(p); |
| } |
| } |
| |
| void |
| corefile(char *name, int explicit) |
| { |
| Fhdr *hdr; |
| char t[100]; |
| Dir *d; |
| |
| if((d = dirstat(name)) == nil){ |
| if(explicit) |
| fprint(2, "%s; %r\n", name); |
| return; |
| } |
| strcpy(t, ctime(d->mtime)); |
| t[strlen(t)-1] = 0; /* newline */ |
| |
| if((hdr = crackhdr(name, OREAD)) == nil){ |
| if(explicit) |
| fprint(2, "%s: %r\n", name); |
| return; |
| } |
| if(hdr->ftype != FCORE){ |
| uncrackhdr(hdr); |
| if(explicit) |
| fprint(2, "%s: not a core file\n", name); |
| return; |
| } |
| print("stack %s\n\t# %s\n\t# %s\n", name, t, hdr->cmdline); |
| uncrackhdr(hdr); |
| } |