URI:
       tcore.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tcore.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 }