1 #include <u.h>
2 #include <libc.h>
3
4 char *data;
5 uchar head[0x8c0];
6
7 void
usage(void)8 usage(void)
9 {
10 fprint(2, "usage: %s file\n", argv0);
11 exits("usage");
12 }
13
14 void
u32(int n,u32int p)15 u32(int n, u32int p)
16 {
17 head[n] = p;
18 head[n+1] = p >> 8;
19 head[n+2] = p >> 16;
20 head[n+3] = p >> 24;
21 }
22
23 u32int
gu32(int n)24 gu32(int n)
25 {
26 return head[n] | head[n+1] << 8 | head[n+2] << 16 | head[n+3] << 24;
27 }
28
29 void
main(int argc,char ** argv)30 main(int argc, char **argv)
31 {
32 int fd, sz, i;
33 u32int ck;
34
35 ARGBEGIN {
36 default:
37 usage();
38 } ARGEND;
39
40 if(argc != 1)
41 usage();
42 fd = open(argv[0], OREAD);
43 if(fd < 0)
44 sysfatal("open: %r");
45 sz = seek(fd, 0, 2);
46 if(sz < 0)
47 sysfatal("seek: %r");
48 data = malloc(sz);
49 if(data == nil)
50 sysfatal("malloc: %r");
51 seek(fd, 0, 0);
52 if(readn(fd, data, sz) < sz)
53 sysfatal("read: %r");
54 close(fd);
55 memset(head, 0, sizeof(head));
56
57 u32(0x20, 0xaa995566);
58 u32(0x24, 0x584C4E58);
59 u32(0x30, sizeof(head));
60 u32(0x34, sz);
61 u32(0x40, sz);
62 ck = 0;
63 for(i = 0x20; i < 0x48; i += 4)
64 ck += gu32(i);
65 u32(0x48, ~ck);
66 u32(0xa0, -1);
67
68 write(1, head, sizeof(head));
69 write(1, data, sz);
70 exits(nil);
71 }
72