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 corefile(name, 1);73 free(d);74 if((fd = open(name, OREAD)) < 0){75 fprint(2, "open %s: %r\n", name);76 return;77 }78 n = dirreadall(fd, &d);79 qsort(d, n, sizeof(d[0]), timecmp);80 for(i=0; i<n; i++){81 p = smprint("%s/%s", name, d[i].name);82 if(p == nil)83 sysfatal("out of memory");84 corefile(p, 0);85 free(p);86 }87 }89 void90 corefile(char *name, int explicit)91 {92 Fhdr *hdr;93 char t[100];94 Dir *d;96 if((d = dirstat(name)) == nil){97 if(explicit)98 fprint(2, "%s; %r\n", name);99 return;100 }101 strcpy(t, ctime(d->mtime));102 t[strlen(t)-1] = 0; /* newline */104 if((hdr = crackhdr(name, OREAD)) == nil){105 if(explicit)106 fprint(2, "%s: %r\n", name);107 return;108 }109 if(hdr->ftype != FCORE){110 uncrackhdr(hdr);111 if(explicit)112 fprint(2, "%s: not a core file\n", name);113 return;114 }115 print("stack %s\n\t# %s\n\t# %s\n", name, t, hdr->cmdline);116 uncrackhdr(hdr);117 }