core.c (1727B)
1 #include <u.h> 2 #include <libc.h> 3 #include <mach.h> 4 5 char *coredir(void); 6 void coreall(char*); 7 void corefile(char*, int); 8 9 void 10 usage(void) 11 { 12 fprint(2, "usage: core [dir | corefile]...\n"); 13 exits("usage"); 14 } 15 16 void 17 main(int argc, char **argv) 18 { 19 int i; 20 21 ARGBEGIN{ 22 default: 23 usage(); 24 }ARGEND 25 26 if(argc == 0){ 27 argc++; 28 *--argv = coredir(); 29 } 30 31 for(i=0; i<argc; i++) 32 coreall(argv[i]); 33 } 34 35 char* 36 coredir(void) 37 { 38 char *dir; 39 40 dir = getenv("COREDIR"); 41 if(dir == nil) 42 dir = "."; 43 return dir; 44 } 45 46 int 47 timecmp(const void *va, const void *vb) 48 { 49 Dir *a, *b; 50 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 } 59 60 void 61 coreall(char *name) 62 { 63 Dir *d; 64 int fd, i, n; 65 char *p; 66 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 } 91 92 void 93 corefile(char *name, int explicit) 94 { 95 Fhdr *hdr; 96 char t[100]; 97 Dir *d; 98 99 if((d = dirstat(name)) == nil){ 100 if(explicit) 101 fprint(2, "%s; %r\n", name); 102 return; 103 } 104 strcpy(t, ctime(d->mtime)); 105 t[strlen(t)-1] = 0; /* newline */ 106 107 if((hdr = crackhdr(name, OREAD)) == nil){ 108 if(explicit) 109 fprint(2, "%s: %r\n", name); 110 return; 111 } 112 if(hdr->ftype != FCORE){ 113 uncrackhdr(hdr); 114 if(explicit) 115 fprint(2, "%s: not a core file\n", name); 116 return; 117 } 118 print("stack %s\n\t# %s\n\t# %s\n", name, t, hdr->cmdline); 119 uncrackhdr(hdr); 120 }