1 a84cbb2a 2004-04-19 devnull #include <u.h>
2 a84cbb2a 2004-04-19 devnull #include <libc.h>
3 a84cbb2a 2004-04-19 devnull #include <bio.h>
4 a84cbb2a 2004-04-19 devnull #include <mach.h>
6 a84cbb2a 2004-04-19 devnull static struct
8 a84cbb2a 2004-04-19 devnull ulong magic;
9 a84cbb2a 2004-04-19 devnull int (*fn)(int, Fhdr*);
10 a84cbb2a 2004-04-19 devnull } cracktab[] = {
11 a84cbb2a 2004-04-19 devnull 0x7F454C46, crackelf,
12 a84cbb2a 2004-04-19 devnull 0xFEEDFACE, crackmacho,
16 a84cbb2a 2004-04-19 devnull crackhdr(char *name, int mode)
18 a84cbb2a 2004-04-19 devnull uchar buf[4];
19 a84cbb2a 2004-04-19 devnull ulong magic;
20 a84cbb2a 2004-04-19 devnull int i, fd;
21 a84cbb2a 2004-04-19 devnull Fhdr *hdr;
23 a84cbb2a 2004-04-19 devnull if((fd = open(name, mode)) < 0)
24 a84cbb2a 2004-04-19 devnull return nil;
26 a84cbb2a 2004-04-19 devnull if(seek(fd, 0, 0) < 0 || readn(fd, buf, 4) != 4){
27 a84cbb2a 2004-04-19 devnull close(fd);
28 a84cbb2a 2004-04-19 devnull return nil;
31 a84cbb2a 2004-04-19 devnull hdr = mallocz(sizeof(Fhdr), 1);
32 a84cbb2a 2004-04-19 devnull if(hdr == nil){
33 a84cbb2a 2004-04-19 devnull close(fd);
34 a84cbb2a 2004-04-19 devnull return nil;
36 a84cbb2a 2004-04-19 devnull hdr->filename = strdup(name);
37 a84cbb2a 2004-04-19 devnull magic = beload4(buf);
38 a84cbb2a 2004-04-19 devnull werrstr("magic doesn't match");
39 a84cbb2a 2004-04-19 devnull for(i=0; i<nelem(cracktab); i++)
40 a84cbb2a 2004-04-19 devnull if(cracktab[i].magic == magic && seek(fd, 0, 0) == 0 && cracktab[i].fn(fd, hdr) >= 0){
41 a84cbb2a 2004-04-19 devnull _addhdr(hdr);
42 a84cbb2a 2004-04-19 devnull return hdr;
44 a84cbb2a 2004-04-19 devnull werrstr("unknown file type: %r");
45 a84cbb2a 2004-04-19 devnull free(hdr);
46 a84cbb2a 2004-04-19 devnull close(fd);
47 a84cbb2a 2004-04-19 devnull return nil;
51 a84cbb2a 2004-04-19 devnull uncrackhdr(Fhdr *hdr)
53 a84cbb2a 2004-04-19 devnull close(hdr->fd);
54 a84cbb2a 2004-04-19 devnull _delhdr(hdr);
55 a84cbb2a 2004-04-19 devnull free(hdr);
59 a84cbb2a 2004-04-19 devnull mapfile(Fhdr *fp, ulong base, Map *map, Regs **regs)
61 a84cbb2a 2004-04-19 devnull if(fp == nil){
62 a84cbb2a 2004-04-19 devnull werrstr("no file");
63 a84cbb2a 2004-04-19 devnull return -1;
65 a84cbb2a 2004-04-19 devnull if(map == nil){
66 a84cbb2a 2004-04-19 devnull werrstr("no map");
67 a84cbb2a 2004-04-19 devnull return -1;
69 a8763864 2004-07-09 devnull if(fp->map == 0){
70 a84cbb2a 2004-04-19 devnull werrstr("cannot load map for this file type");
71 a84cbb2a 2004-04-19 devnull return -1;
73 a84cbb2a 2004-04-19 devnull return fp->map(fp, base, map, regs);
77 a84cbb2a 2004-04-19 devnull unmapfile(Fhdr *fp, Map *map)
81 a84cbb2a 2004-04-19 devnull if(map == nil || fp == nil)
84 a84cbb2a 2004-04-19 devnull for(i=0; i<map->nseg; i++){
85 a84cbb2a 2004-04-19 devnull while(i<map->nseg && map->seg[i].fd == fp->fd){
86 a84cbb2a 2004-04-19 devnull map->nseg--;
87 a84cbb2a 2004-04-19 devnull memmove(&map->seg[i], &map->seg[i+1],
88 a84cbb2a 2004-04-19 devnull (map->nseg-i)*sizeof(map->seg[0]));