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 void10 usage(void)11 {12 fprint(2, "usage: core [dir | corefile]...\n");13 exits("usage");14 }16 void17 main(int argc, char **argv)18 {19 int i;21 ARGBEGIN{22 default:23 usage();24 }ARGEND26 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 int47 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 void61 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 void93 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;103 }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;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 }