URI: 
       tadd core cmd - 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 20173464d2169892bde1a91bbfd1c2a811a79ace
   DIR parent 170d47ee1fe2e59a37344025de696bc0d57989bb
  HTML Author: rsc <devnull@localhost>
       Date:   Tue, 18 Jan 2005 20:26:26 +0000
       
       add core cmd
       
       Diffstat:
         M include/mach.h                      |       1 +
         M src/libmach/cmdline.c               |       1 +
         M src/libmach/crackelf.c              |      62 +++++++++++++++++++++++++++++++
         M src/libmach/elf.h                   |       1 +
       
       4 files changed, 65 insertions(+), 0 deletions(-)
       ---
   DIR diff --git a/include/mach.h b/include/mach.h
       t@@ -259,6 +259,7 @@ struct Fhdr
                void                *dwarf;                /* handle to dwarf image */
                void                *macho;                /* handle to mach-o image */
                struct Stab        stabs;
       +        char                *cmd;                /* command-line that produced core */
        
                /* private */
                Symbol        *sym;                /* cached list of symbols */
   DIR diff --git a/src/libmach/cmdline.c b/src/libmach/cmdline.c
       t@@ -58,6 +58,7 @@ attachargs(int argc, char **argv, int omode)
                        }
                        fprint(2, "%s: %s %s %s\n", argv[i], hdr->aname, hdr->mname, hdr->fname);
                        if(hdr->ftype == FCORE){
       +                        fprint(2, "core cmd: %s\n", hdr->cmd);
                                if(corpid){
                                        fprint(2, "already have corpid %d; ignoring core %s\n", corpid, argv[i]);
                                        uncrackhdr(hdr);
   DIR diff --git a/src/libmach/crackelf.c b/src/libmach/crackelf.c
       t@@ -6,6 +6,7 @@
        
        static int mapelf(Fhdr *fp, ulong base, Map *map, Regs**);
        static int mapcoreregs(Fhdr *fp, Map *map, Regs**);
       +static char *getcorecmd(Fhdr *fp, Map *map);
        
        static struct
        {
       t@@ -137,6 +138,7 @@ crackelf(int fd, Fhdr *fp)
                                || ctab[i].mtype != fp->mtype)
                                        continue;
                                elf->coreregs = ctab[i].coreregs;
       +                        elf->corecmd = ctab[i].corecmd;
                                break;
                        }
                        return 0;
       t@@ -257,6 +259,8 @@ mapelf(Fhdr *fp, ulong base, Map *map, Regs **regs)
                if(fp->ftype == FCORE){
                        if(mapcoreregs(fp, map, regs) < 0)
                                fprint(2, "warning: reading core regs: %r");
       +                if((fp->cmd = getcorecmd(fp, map)) == nil)
       +                        fprint(2, "warning: reading core command: %r");
                }
        
                return 0;        
       t@@ -347,3 +351,61 @@ mapcoreregs(Fhdr *fp, Map *map, Regs **rp)
                return -1;
        }
        
       +static char*
       +getcorecmd(Fhdr *fp, Map *map)
       +{
       +        int i;
       +        uchar *a, *sa, *ea;
       +        char *cmd;
       +        uint n;
       +        ElfNote note;
       +        ElfProg *p;
       +        Elf *elf;
       +
       +        elf = fp->elf;
       +        if(elf->corecmd == 0){
       +                werrstr("cannot parse %s %s cores", fp->mname, fp->aname);
       +                return nil;
       +        }
       +
       +        for(i=0; i<elf->nprog; i++){
       +                p = &elf->prog[i];
       +                if(p->type != ElfProgNote)
       +                        continue;
       +                n = p->filesz;
       +                a = malloc(n);
       +                if(a == nil)
       +                        return nil;
       +                if(seek(fp->fd, p->offset, 0) < 0 || readn(fp->fd, a, n) != n){
       +                        free(a);
       +                        continue;
       +                }
       +                sa = a;
       +                ea = a+n;
       +                while(a < ea){
       +                        note.offset = (a-sa) + p->offset;
       +                        if(unpacknote(elf, a, ea, &note, &a) < 0)
       +                                break;
       +                        switch(note.type){
       +                        case ElfNotePrPsinfo:
       +                                if((n = elf->corecmd(elf, &note, &cmd)) < 0){
       +                                        free(sa);
       +                                        return nil;
       +                                }
       +                                free(sa);
       +                                return cmd;
       +                        case ElfNotePrStatus:
       +                        case ElfNotePrFpreg:
       +                        case ElfNotePrTaskstruct:
       +                        case ElfNotePrAuxv:
       +                        case ElfNotePrXfpreg:
       +                                break;
       +                        }
       +                //        fprint(2, "0x%lux note %s/%lud %p\n", note.offset, note.name, note.type, note.desc);
       +                }
       +                free(sa);
       +        }
       +        fprint(2, "could not find registers in core file\n");
       +        return nil;
       +}
       +
   DIR diff --git a/src/libmach/elf.h b/src/libmach/elf.h
       t@@ -221,6 +221,7 @@ struct Elf
                ulong        dynamic;                /* offset to elf dynamic crap */
        
                int                (*coreregs)(Elf*, ElfNote*, uchar**);
       +        int                (*corecmd)(Elf*, ElfNote*, char**);
        };
        
        Elf*        elfopen(char*);