Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>4 #include <mach.h>6 static struct7 {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 void51 uncrackhdr(Fhdr *hdr)52 {53 close(hdr->fd);54 _delhdr(hdr);55 free(hdr);56 }58 int59 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 == 0){70 werrstr("cannot load map for this file type");71 return -1;72 }73 return fp->map(fp, base, map, regs);74 }76 void77 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 }