plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }