URI:
       tadd - 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
       ---
   DIR commit 58698c9c1205e44c77734e7a32338f6c08bc4aaa
   DIR parent 20173464d2169892bde1a91bbfd1c2a811a79ace
  HTML Author: rsc <devnull@localhost>
       Date:   Tue, 18 Jan 2005 20:45:12 +0000
       
       add
       
       Diffstat:
         A src/cmd/core.c                      |     102 +++++++++++++++++++++++++++++++
       
       1 file changed, 102 insertions(+), 0 deletions(-)
       ---
   DIR diff --git a/src/cmd/core.c b/src/cmd/core.c
       t@@ -0,0 +1,102 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <mach.h>
       +
       +char *coredir(void);
       +void coreall(char*);
       +void corefile(char*, int);
       +
       +void
       +usage(void)
       +{
       +        fprint(2, "usage: core [dir | corefile]...\n");
       +        exits("usage");
       +}
       +
       +void
       +main(int argc, char **argv)
       +{
       +        int i;
       +
       +        ARGBEGIN{
       +        default:
       +                usage();
       +        }ARGEND
       +
       +        if(argc == 0){
       +                argc++;
       +                *--argv = coredir();
       +        }
       +
       +        for(i=0; i<argc; i++)
       +                coreall(argv[i]);
       +}
       +
       +char*
       +coredir(void)
       +{
       +        char *dir;
       +
       +        dir = getenv("COREDIR");
       +        if(dir == nil)
       +                dir = ".";
       +        return dir;
       +}
       +
       +void
       +coreall(char *name)
       +{
       +        Dir *d;
       +        int fd, i, n;
       +        char *p;
       +
       +        if((d = dirstat(name)) == nil){
       +                fprint(2, "%s: %r\n", name);
       +                return;
       +        }
       +        if((d->mode&DMDIR) == 0)
       +                corefile(name, 1);
       +        free(d);
       +        if((fd = open(name, OREAD)) < 0){
       +                fprint(2, "open %s: %r\n", name);
       +                return;
       +        }
       +        n = dirreadall(fd, &d);
       +        for(i=0; i<n; i++){
       +                p = smprint("%s/%s", name, d[i].name);
       +                if(p == nil)
       +                        sysfatal("out of memory");
       +                corefile(p, 0);
       +                free(p);
       +        }
       +}
       +
       +void
       +corefile(char *name, int explicit)
       +{
       +        Fhdr *hdr;
       +        char t[100];
       +        Dir *d;
       +
       +        if((d = dirstat(name)) == nil){
       +                if(explicit)
       +                        fprint(2, "%s; %r\n", name);
       +                return;
       +        }
       +        strcpy(t, ctime(d->mtime));
       +        t[strlen(t)-1] = 0;        /* newline */
       +
       +        if((hdr = crackhdr(name, OREAD)) == nil){
       +                if(explicit)
       +                        fprint(2, "%s: %r\n", name);
       +                return;
       +        }
       +        if(hdr->ftype != FCORE){
       +                uncrackhdr(hdr);
       +                if(explicit)
       +                        fprint(2, "%s: not a core file\n", name);
       +                return;
       +        }
       +        print("acid %s # %s %s\n", name, t, hdr->cmd);
       +        uncrackhdr(hdr);
       +}