Blob


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